/ Hex Artifact Content
Login

Artifact d8a9a8b6cbf9ddc2ae6f1aaea5d70381999012c15ac10f9314091fc703c3d7e9:


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 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  , b) 0.#endif..#
0f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f70: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f90: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
0fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
0fb0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
0fc0: 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  of an assert() s
0fd0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a  tatement. ***.**
0fe0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0ff0: 20 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73   if pBtree holds
1000: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1010: 63 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  cks to read or w
1020: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20  rite to the .** 
1030: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
1040: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65  page iRoot.   Re
1050: 74 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65  turn 1 if it doe
1060: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  s and 0 if not..
1070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1080: 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  e, when writing 
1090: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
10a0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20  root-page iRoot 
10b0: 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f  via .** Btree co
10c0: 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a  nnection pBtree:
10d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
10e0: 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
10f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65  TableLock(pBtree
1100: 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54  , iRoot, 0, WRIT
1110: 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a  E_LOCK) );.**.**
1120: 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   When writing to
1130: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72   an index that r
1140: 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72  esides in a shar
1150: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74  able database, t
1160: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
1170: 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20  ould have first 
1180: 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20  obtained a lock 
1190: 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72  specifying the r
11a0: 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  oot page of.** t
11b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b   table. This mak
11d0: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
11e0: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
11f0: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
1200: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
1210: 74 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72  table as a separ
1220: 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54  ate structure. T
1230: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74  o determine.** t
1240: 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
1250: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
1260: 64 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65  dex being writte
1270: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
1280: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
1290: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
12a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
12b0: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
12c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
12d0: 62 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64  ble/index rooted
12e0: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
12f0: 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a  the caller may.*
1300: 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c  * hold a write-l
1310: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1320: 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61  a table (root pa
1330: 67 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61  ge 1). This is a
1340: 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c  lso.** acceptabl
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1360: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1370: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65  ableLock(.  Btre
1380: 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20  e *pBtree,      
1390: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61     /* Handle tha
13a0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b  t must hold lock
13b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
13c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13d0: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74  Root page of b-t
13e0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ree */.  int isI
13f0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1400: 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74  /* True if iRoot
1410: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
1420: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
1430: 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79  */.  int eLockTy
1440: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  pe          /* R
1450: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70  equired lock typ
1460: 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  e (READ_LOCK or 
1470: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29  WRITE_LOCK) */.)
1480: 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  {.  Schema *pSch
1490: 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29  ema = (Schema *)
14a0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63  pBtree->pBt->pSc
14b0: 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61  hema;.  Pgno iTa
14c0: 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  b = 0;.  BtLock 
14d0: 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  *pLock;..  /* If
14e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
14f0: 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c  s not shareable,
1500: 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e   or if the clien
1510: 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a  t is reading.  *
1520: 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65  * and has the re
1530: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
1540: 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f  lag set, then no
1550: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
1560: 64 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  d. .  ** Return 
1570: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ..  */.  if( (pB
1590: 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d  tree->sharable==
15a0: 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54  0).   || (eLockT
15b0: 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26  ype==READ_LOCK &
15c0: 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  & (pBtree->db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15e0: 61 64 55 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29  adUncommit)).  )
15f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
1600: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
1610: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1620: 6e 67 20 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ng  or writing a
1630: 6e 20 69 6e 64 65 78 20 61 6e 64 20 74 68 65 20  n index and the 
1640: 73 63 68 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e  schema is.  ** n
1650: 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20  ot loaded, then 
1660: 69 74 20 69 73 20 74 6f 6f 20 64 69 66 66 69 63  it is too diffic
1670: 75 6c 74 20 74 6f 20 61 63 74 75 61 6c 6c 79 20  ult to actually 
1680: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 0a  check to see if.
1690: 20 20 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74    ** the correct
16a0: 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 2e   locks are held.
16b0: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68    So do not both
16c0: 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
16d0: 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73   true..  ** This
16e0: 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 63   case does not c
16f0: 6f 6d 65 20 75 70 20 76 65 72 79 20 6f 66 74 65  ome up very ofte
1700: 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20  n anyhow..  */. 
1710: 20 69 66 28 20 69 73 49 6e 64 65 78 20 26 26 20   if( isIndex && 
1720: 28 21 70 53 63 68 65 6d 61 20 7c 7c 20 28 70 53  (!pSchema || (pS
1730: 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61  chema->schemaFla
1740: 67 73 26 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  gs&DB_SchemaLoad
1750: 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72  ed)==0) ){.    r
1760: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
1770: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
1780: 65 20 72 6f 6f 74 2d 70 61 67 65 20 74 68 61 74  e root-page that
1790: 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64   the lock should
17a0: 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72   be held on. For
17b0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72   table.  ** b-tr
17c0: 65 65 73 2c 20 74 68 69 73 20 69 73 20 6a 75 73  ees, this is jus
17d0: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
17e0: 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 62 65  of the b-tree be
17f0: 69 6e 67 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a  ing read or.  **
1800: 20 77 72 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e   written. For in
1810: 64 65 78 20 62 2d 74 72 65 65 73 2c 20 69 74 20  dex b-trees, it 
1820: 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
1830: 20 6f 66 20 74 68 65 20 61 73 73 6f 63 69 61 74   of the associat
1840: 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20  ed.  ** table.  
1850: 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78  */.  if( isIndex
1860: 20 29 7b 0a 20 20 20 20 48 61 73 68 45 6c 65 6d   ){.    HashElem
1870: 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73   *p;.    for(p=s
1880: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
1890: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
18a0: 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61  ); p; p=sqliteHa
18b0: 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20  shNext(p)){.    
18c0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
18d0: 28 49 6e 64 65 78 20 2a 29 73 71 6c 69 74 65 48  (Index *)sqliteH
18e0: 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20  ashData(p);.    
18f0: 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d    if( pIdx->tnum
1900: 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a  ==(int)iRoot ){.
1910: 20 20 20 20 20 20 20 20 69 66 28 20 69 54 61 62          if( iTab
1920: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1930: 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64   Two or more ind
1940: 65 78 65 73 20 73 68 61 72 65 20 74 68 65 20 73  exes share the s
1950: 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 20  ame root page.  
1960: 54 68 65 72 65 20 6d 75 73 74 0a 20 20 20 20 20  There must.     
1970: 20 20 20 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73       ** be impos
1980: 74 65 72 20 74 61 62 6c 65 73 2e 20 20 53 6f 20  ter tables.  So 
1990: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
19a0: 2e 20 20 54 68 65 20 61 73 73 65 72 74 20 69 73  .  The assert is
19b0: 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 20 20 2a   not.          *
19c0: 2a 20 75 73 65 66 75 6c 20 69 6e 20 74 68 61 74  * useful in that
19d0: 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20   case. */.      
19e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
19f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a00: 69 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61  iTab = pIdx->pTa
1a10: 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  ble->tnum;.     
1a20: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1a30: 7b 0a 20 20 20 20 69 54 61 62 20 3d 20 69 52 6f  {.    iTab = iRo
1a40: 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ot;.  }..  /* Se
1a50: 61 72 63 68 20 66 6f 72 20 74 68 65 20 72 65 71  arch for the req
1a60: 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68  uired lock. Eith
1a70: 65 72 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  er a write-lock 
1a80: 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  on root-page iTa
1a90: 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72 69 74 65  b, a .  ** write
1aa0: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68  -lock on the sch
1ab0: 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72 20 28 69  ema table, or (i
1ac0: 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20  f the client is 
1ad0: 72 65 61 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20  reading) a.  ** 
1ae0: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61  read-lock on iTa
1af0: 62 20 77 69 6c 6c 20 73 75 66 66 69 63 65 2e 20  b will suffice. 
1b00: 52 65 74 75 72 6e 20 31 20 69 66 20 61 6e 79 20  Return 1 if any 
1b10: 6f 66 20 74 68 65 73 65 20 61 72 65 20 66 6f 75  of these are fou
1b20: 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c  nd.  */.  for(pL
1b30: 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  ock=pBtree->pBt-
1b40: 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70  >pLock; pLock; p
1b50: 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78  Lock=pLock->pNex
1b60: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63  t){.    if( pLoc
1b70: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74 72 65  k->pBtree==pBtre
1b80: 65 20 0a 20 20 20 20 20 26 26 20 28 70 4c 6f 63  e .     && (pLoc
1b90: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20  k->iTable==iTab 
1ba0: 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  || (pLock->eLock
1bb0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20  ==WRITE_LOCK && 
1bc0: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31  pLock->iTable==1
1bd0: 29 29 0a 20 20 20 20 20 26 26 20 70 4c 6f 63 6b  )).     && pLock
1be0: 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79  ->eLock>=eLockTy
1bf0: 70 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  pe .    ){.     
1c00: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1c10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65  .  }..  /* Faile
1c20: 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 72 65  d to find the re
1c30: 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  quired lock. */.
1c40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1c50: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
1c60: 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20  EBUG */..#ifdef 
1c70: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1c80: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
1c90: 6f 6e 20 6d 61 79 20 62 65 20 75 73 65 64 20 61  on may be used a
1ca0: 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
1cb0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  () statements on
1cc0: 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52  ly. ****.**.** R
1cd0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
1ce0: 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c 65 67 61   would be illega
1cf0: 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20  l for pBtree to 
1d00: 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a  write into the.*
1d10: 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  * table or index
1d20: 20 72 6f 6f 74 65 64 20 61 74 20 69 52 6f 6f 74   rooted at iRoot
1d30: 20 62 65 63 61 75 73 65 20 6f 74 68 65 72 20 73   because other s
1d40: 68 61 72 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  hared connection
1d50: 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61  s are.** simulta
1d60: 6e 65 6f 75 73 6c 79 20 72 65 61 64 69 6e 67 20  neously reading 
1d70: 74 68 61 74 20 73 61 6d 65 20 74 61 62 6c 65 20  that same table 
1d80: 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  or index..**.** 
1d90: 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f  It is illegal fo
1da0: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
1db0: 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
1dc0: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 74 68 61  Btree object tha
1dd0: 74 0a 2a 2a 20 73 68 61 72 65 73 20 74 68 65 20  t.** shares the 
1de0: 73 61 6d 65 20 42 74 53 68 61 72 65 64 20 6f 62  same BtShared ob
1df0: 6a 65 63 74 20 69 73 20 63 75 72 72 65 6e 74 6c  ject is currentl
1e00: 79 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  y reading or wri
1e10: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f  ting.** the iRoo
1e20: 74 20 74 61 62 6c 65 2e 20 20 45 78 63 65 70 74  t table.  Except
1e30: 2c 20 69 66 20 74 68 65 20 6f 74 68 65 72 20 42  , if the other B
1e40: 74 72 65 65 20 6f 62 6a 65 63 74 20 68 61 73 20  tree object has 
1e50: 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f  the.** read-unco
1e60: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74  mmitted flag set
1e70: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 4f 4b 20  , then it is OK 
1e80: 66 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 62  for the other ob
1e90: 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20  ject to.** have 
1ea0: 61 20 72 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a  a read cursor..*
1eb0: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1ec0: 2c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  , before writing
1ed0: 20 74 6f 20 61 6e 79 20 70 61 72 74 20 6f 66 20   to any part of 
1ee0: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
1ef0: 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20  ex.** rooted at 
1f00: 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20  page iRoot, one 
1f10: 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a  should call:.**.
1f20: 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 21 68  **    assert( !h
1f30: 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
1f40: 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 29 20 29  pBtree, iRoot) )
1f50: 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
1f60: 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
1f70: 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
1f80: 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42  Pgno iRoot){.  B
1f90: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f  tCursor *p;.  fo
1fa0: 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
1fb0: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
1fc0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1fd0: 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  ( p->pgnoRoot==i
1fe0: 52 6f 6f 74 20 0a 20 20 20 20 20 26 26 20 70 2d  Root .     && p-
1ff0: 3e 70 42 74 72 65 65 21 3d 70 42 74 72 65 65 0a  >pBtree!=pBtree.
2000: 20 20 20 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70       && 0==(p->p
2010: 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Btree->db->flags
2020: 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e   & SQLITE_ReadUn
2030: 63 6f 6d 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20  commit).    ){. 
2040: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2050: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2060: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20  n 0;.}.#endif   
2070: 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54   /* #ifdef SQLIT
2080: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a  E_DEBUG */../*.*
2090: 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69  * Query to see i
20a0: 66 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  f Btree handle p
20b0: 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f   may obtain a lo
20c0: 63 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b  ck of type eLock
20d0: 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20   .** (READ_LOCK 
20e0: 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f  or WRITE_LOCK) o
20f0: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
2100: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e   root-page iTab.
2110: 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   Return.** SQLIT
2120: 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b  E_OK if the lock
2130: 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64   may be obtained
2140: 20 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   (by calling.** 
2150: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
2160: 62 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53  bleLock()), or S
2170: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
2180: 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
2190: 6e 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61  nt querySharedCa
21a0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72  cheTableLock(Btr
21b0: 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62  ee *p, Pgno iTab
21c0: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
21d0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
21e0: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
21f0: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2200: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2210: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
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 65 4c  =READ_LOCK || eL
2240: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2250: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2260: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
2270: 74 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67  t( !(p->db->flag
2280: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
2290: 6f 6d 6d 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57  ommit)||eLock==W
22a0: 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d  RITE_LOCK||iTab=
22b0: 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  =1 );.  .  /* If
22c0: 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77 72   requesting a wr
22d0: 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  ite-lock, then t
22e0: 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68 61  he Btree must ha
22f0: 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  ve an open write
2300: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
2310: 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e 20  n on this file. 
2320: 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20  And, obviously, 
2330: 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20 73  for this to be s
2340: 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75  o there .  ** mu
2350: 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77 72  st be an open wr
2360: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2370: 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73 65  on the file itse
2380: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  lf..  */.  asser
2390: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
23a0: 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e  OCK || (p==pBt->
23b0: 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69 6e  pWriter && p->in
23c0: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
23d0: 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  TE) );.  assert(
23e0: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
23f0: 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e  K || pBt->inTran
2400: 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
2410: 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  RITE );.  .  /* 
2420: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2430: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73  a no-op if the s
2440: 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e  hared-cache is n
2450: 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  ot enabled */.  
2460: 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
2470: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2480: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2490: 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68 65   /* If some othe
24a0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  r connection is 
24b0: 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c 75  holding an exclu
24c0: 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20  sive lock, the. 
24d0: 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c 6f   ** requested lo
24e0: 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62  ck may not be ob
24f0: 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  tained..  */.  i
2500: 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 21  f( pBt->pWriter!
2510: 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  =p && (pBt->btsF
2520: 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55  lags & BTS_EXCLU
2530: 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  SIVE)!=0 ){.    
2540: 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
2550: 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
2560: 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
2570: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2580: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
2590: 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20  EDCACHE;.  }..  
25a0: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
25b0: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
25c0: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
25d0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e  {.    /* The con
25e0: 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65  dition (pIter->e
25f0: 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20  Lock!=eLock) in 
2600: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66  the following if
2610: 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74  (...) .    ** st
2620: 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69 6d  atement is a sim
2630: 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a  plification of:.
2640: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2650: 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  (eLock==WRITE_LO
2660: 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f  CK || pIter->eLo
2670: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a  ck==WRITE_LOCK).
2680: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69      **.    ** si
2690: 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  nce we know that
26a0: 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   if eLock==WRITE
26b0: 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f  _LOCK, then no o
26c0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  ther connection.
26d0: 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20      ** may hold 
26e0: 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20  a WRITE_LOCK on 
26f0: 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68 69  any table in thi
2700: 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74 68  s file (since th
2710: 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f  ere can.    ** o
2720: 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65 20  nly be a single 
2730: 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a  writer)..    */.
2740: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
2750: 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  r->eLock==READ_L
2760: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
2770: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2780: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  );.    assert( e
2790: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
27a0: 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  || pIter->pBtree
27b0: 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  ==p || pIter->eL
27c0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b  ock==READ_LOCK);
27d0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
27e0: 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49 74  pBtree!=p && pIt
27f0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2800: 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   && pIter->eLock
2810: 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  !=eLock ){.     
2820: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2830: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2840: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
2850: 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  db);.      if( e
2860: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2870: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
2880: 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69  rt( p==pBt->pWri
2890: 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ter );.        p
28a0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
28b0: 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20  BTS_PENDING;.   
28c0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
28d0: 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  n SQLITE_LOCKED_
28e0: 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20  SHAREDCACHE;.   
28f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2900: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
2910: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
2920: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
2930: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
2940: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
2950: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20  CACHE./*.** Add 
2960: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
2970: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
2980: 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65  ge iTable to the
2990: 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75 73   shared-btree us
29a0: 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68  ed.** by Btree h
29b0: 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74  andle p. Paramet
29c0: 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er eLock must be
29d0: 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43   either READ_LOC
29e0: 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c  K or .** WRITE_L
29f0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  OCK..**.** This 
2a00: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
2a10: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
2a20: 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65 20  **.**   (a) The 
2a30: 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65 20  specified Btree 
2a40: 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e 6e  object p is conn
2a50: 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72 61  ected to a shara
2a60: 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  ble.**       dat
2a70: 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68 20  abase (one with 
2a80: 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68 61  the BtShared.sha
2a90: 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29 2c  rable flag set),
2aa0: 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29   and.**.**   (b)
2ab0: 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65 20   No other Btree 
2ac0: 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20 6c  objects hold a l
2ad0: 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69 63  ock that conflic
2ae0: 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68  ts.**       with
2af0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
2b00: 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79 53  ock (i.e. queryS
2b10: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
2b20: 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20 20  ock() has.**    
2b30: 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20     already been 
2b40: 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75 72  called and retur
2b50: 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a  ned SQLITE_OK)..
2b60: 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
2b70: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
2b80: 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64  he lock is added
2b90: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53   successfully. S
2ba0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20  QLITE_NOMEM .** 
2bb0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
2bc0: 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20   malloc attempt 
2bd0: 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
2be0: 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43 61   int setSharedCa
2bf0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72  cheTableLock(Btr
2c00: 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62  ee *p, Pgno iTab
2c10: 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20  le, u8 eLock){. 
2c20: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2c30: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
2c40: 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  k *pLock = 0;.  
2c50: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
2c60: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2c70: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
2c80: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
2c90: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
2ca0: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  K || eLock==WRIT
2cb0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
2cc0: 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a  rt( p->db!=0 );.
2cd0: 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69  .  /* A connecti
2ce0: 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61 64  on with the read
2cf0: 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  -uncommitted fla
2d00: 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65 72  g set will never
2d10: 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74   try to.  ** obt
2d20: 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ain a read-lock 
2d30: 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  using this funct
2d40: 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65  ion. The only re
2d50: 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64  ad-lock obtained
2d60: 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65  .  ** by a conne
2d70: 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e  ction in read-un
2d80: 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 69  committed mode i
2d90: 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  s on the sqlite_
2da0: 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61 62  master .  ** tab
2db0: 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f 63  le, and that loc
2dc0: 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e  k is obtained in
2dd0: 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73   BtreeBeginTrans
2de0: 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ().  */.  assert
2df0: 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61  ( 0==(p->db->fla
2e00: 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  gs&SQLITE_ReadUn
2e10: 63 6f 6d 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b  commit) || eLock
2e20: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2e30: 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
2e40: 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ion should only 
2e50: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73  be called on a s
2e60: 68 61 72 61 62 6c 65 20 62 2d 74 72 65 65 20 61  harable b-tree a
2e70: 66 74 65 72 20 69 74 20 0a 20 20 2a 2a 20 68 61  fter it .  ** ha
2e80: 73 20 62 65 65 6e 20 64 65 74 65 72 6d 69 6e 65  s been determine
2e90: 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
2ea0: 62 2d 74 72 65 65 20 68 6f 6c 64 73 20 61 20 63  b-tree holds a c
2eb0: 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e  onflicting lock.
2ec0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2ed0: 2d 3e 73 68 61 72 61 62 6c 65 20 29 3b 0a 20 20  ->sharable );.  
2ee0: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
2ef0: 4b 3d 3d 71 75 65 72 79 53 68 61 72 65 64 43 61  K==querySharedCa
2f00: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
2f10: 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29  iTable, eLock) )
2f20: 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73 65  ;..  /* First se
2f30: 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66 6f  arch the list fo
2f40: 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f  r an existing lo
2f50: 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  ck on this table
2f60: 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65 72  . */.  for(pIter
2f70: 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
2f80: 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
2f90: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
2fa0: 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d   pIter->iTable==
2fb0: 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72 2d  iTable && pIter-
2fc0: 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20  >pBtree==p ){.  
2fd0: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65      pLock = pIte
2fe0: 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  r;.      break;.
2ff0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
3000: 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65 61  If the above sea
3010: 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e 64  rch did not find
3020: 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63 74   a BtLock struct
3030: 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74 72   associating Btr
3040: 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20 74  ee p.  ** with t
3050: 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c  able iTable, all
3060: 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69  ocate one and li
3070: 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6c  nk it into the l
3080: 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
3090: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  !pLock ){.    pL
30a0: 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29  ock = (BtLock *)
30b0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
30c0: 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29  o(sizeof(BtLock)
30d0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f 63  );.    if( !pLoc
30e0: 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  k ){.      retur
30f0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
3100: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
3110: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
3120: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
3130: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
3140: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
3150: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
3160: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
3170: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
3180: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
3190: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
31a0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
31b0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
31c0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
31d0: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
31e0: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
31f0: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
3200: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
3210: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
3220: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
3230: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
3240: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
3250: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
3260: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
3270: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
3280: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
3290: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
32a0: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
32b0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
32c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
32d0: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
32e0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
32f0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3300: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3310: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3320: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3330: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3340: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3350: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
3360: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
3370: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
3380: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
3390: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
33a0: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
33b0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
33c0: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
33d0: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
33e0: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
33f0: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
3400: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3410: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3420: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3430: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3440: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3450: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
3460: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
3470: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
3480: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
3490: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
34a0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
34b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
34c0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
34d0: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
34e0: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
34f0: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
3500: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3510: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3520: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3530: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3540: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3550: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
3560: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
3570: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
3580: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
3590: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
35a0: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
35b0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
35c0: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
35d0: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
35e0: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
35f0: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
3600: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3610: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3620: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3630: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3640: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3650: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3660: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
3670: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
3680: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
3690: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
36a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
36b0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
36c0: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
36d0: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
36e0: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
36f0: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
3700: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3710: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3720: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3730: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3740: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3750: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
3760: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
3770: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
3780: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
3790: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
37a0: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
37b0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
37c0: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
37d0: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
37e0: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
37f0: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
3800: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3810: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3820: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3830: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3840: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3850: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
3860: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
3870: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
3880: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
3890: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
38a0: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
38b0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
38c0: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
38d0: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
38e0: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
38f0: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
3900: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3910: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3920: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3930: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3940: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3950: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
3960: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3970: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
3980: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
3990: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
39a0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
39b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
39c0: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
39d0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
39e0: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
39f0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3a00: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3a10: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3a20: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3a30: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a40: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a50: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a60: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a70: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
3a80: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
3a90: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
3aa0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
3ab0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3ac0: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
3ad0: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
3ae0: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
3af0: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
3b00: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3b10: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3b20: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3b30: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3b40: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3b50: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
3b60: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
3b70: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
3b80: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
3b90: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
3ba0: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
3bb0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
3bc0: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
3bd0: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
3be0: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
3bf0: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
3c00: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3c10: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3c20: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3c30: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3c40: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3c50: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3c60: 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 20 56 65  mutex);.}../* Ve
3c70: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75  rify that the cu
3c80: 72 73 6f 72 20 61 6e 64 20 74 68 65 20 42 74 53  rsor and the BtS
3c90: 68 61 72 65 64 20 61 67 72 65 65 20 61 62 6f 75  hared agree abou
3ca0: 74 20 77 68 61 74 20 69 73 20 74 68 65 20 63 75  t what is the cu
3cb0: 72 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73  rrent.** databas
3cc0: 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e 20 54 68 69  e connetion. Thi
3cd0: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69  s is important i
3ce0: 6e 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  n shared-cache m
3cf0: 6f 64 65 2e 20 49 66 20 74 68 65 20 64 61 74 61  ode. If the data
3d00: 62 61 73 65 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74  base .** connect
3d10: 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 67 65 74  ion pointers get
3d20: 20 6f 75 74 2d 6f 66 2d 73 79 6e 63 2c 20 69 74   out-of-sync, it
3d30: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
3d40: 20 72 6f 75 74 69 6e 65 73 20 6c 69 6b 65 0a 2a   routines like.*
3d50: 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  * btreeInitPage(
3d60: 29 20 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61  ) to reference a
3d70: 6e 20 73 74 61 6c 65 20 63 6f 6e 6e 65 63 74 69  n stale connecti
3d80: 6f 6e 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20  on pointer that 
3d90: 72 65 66 65 72 65 6e 63 65 73 20 61 0a 2a 2a 20  references a.** 
3da0: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61  a connection tha
3db0: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 63 6c  t has already cl
3dc0: 6f 73 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  osed.  This rout
3dd0: 69 6e 65 20 69 73 20 75 73 65 64 20 69 6e 73 69  ine is used insi
3de0: 64 65 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73  de assert().** s
3df0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 20 61  tatements only a
3e00: 6e 64 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  nd for the purpo
3e10: 73 65 20 6f 66 20 64 6f 75 62 6c 65 2d 63 68 65  se of double-che
3e20: 63 6b 69 6e 67 20 74 68 61 74 20 74 68 65 20 62  cking that the b
3e30: 74 72 65 65 20 63 6f 64 65 0a 2a 2a 20 64 6f 65  tree code.** doe
3e40: 73 20 6b 65 65 70 20 74 68 65 20 64 61 74 61 62  s keep the datab
3e50: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ase connection p
3e60: 6f 69 6e 74 65 72 73 20 75 70 2d 74 6f 2d 64 61  ointers up-to-da
3e70: 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
3e80: 74 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  t cursorOwnsBtSh
3e90: 61 72 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  ared(BtCursor *p
3ea0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
3eb0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  sorHoldsMutex(p)
3ec0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d   );.  return (p-
3ed0: 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e  >pBtree->db==p->
3ee0: 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64  pBt->db);.}.#end
3ef0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69  if../*.** Invali
3f00: 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  date the overflo
3f10: 77 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 63  w cache of the c
3f20: 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20  ursor passed as 
3f30: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
3f40: 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  nt..** on the sh
3f50: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
3f60: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65  ture pBt..*/.#de
3f70: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f  fine invalidateO
3f80: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
3f90: 72 29 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  r) (pCur->curFla
3fa0: 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69  gs &= ~BTCF_Vali
3fb0: 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e  dOvfl)../*.** In
3fc0: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3fd0: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
3fe0: 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75  cache for all cu
3ff0: 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
4000: 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74  on the shared bt
4010: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42  ree structure pB
4020: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
4030: 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  d invalidateAllO
4040: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53  verflowCache(BtS
4050: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
4060: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
4070: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
4080: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
4090: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  tex) );.  for(p=
40a0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
40b0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
40c0: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
40d0: 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20  flowCache(p);.  
40e0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
40f0: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
4100: 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  B./*.** This fun
4110: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
4120: 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
4130: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
4140: 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69   a table.** to i
4150: 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e  nvalidate any in
4160: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74  crblob cursors t
4170: 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20  hat are open on 
4180: 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e  the.** row or on
4190: 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65  e of the rows be
41a0: 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a  ing modified..**
41b0: 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
41c0: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20  isClearTable is 
41d0: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65  true, then the e
41e0: 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
41f0: 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69  f the.** table i
4200: 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65  s about to be de
4210: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
4220: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61  ase invalidate a
4230: 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63  ll incrblob.** c
4240: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61  ursors open on a
4250: 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68  ny row within th
4260: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
4270: 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e  t-page pgnoRoot.
4280: 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
4290: 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73  , if argument is
42a0: 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66 61  ClearTable is fa
42b0: 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  lse, then the ro
42c0: 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20  w with.** rowid 
42d0: 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65  iRow is being re
42e0: 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65  placed or delete
42f0: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
4300: 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e  invalidate.** on
4310: 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f  ly those incrblo
4320: 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  b cursors open o
4330: 6e 20 74 68 61 74 20 73 70 65 63 69 66 69 63 20  n that specific 
4340: 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  row..*/.static v
4350: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e  oid invalidateIn
4360: 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20  crblobCursors(. 
4370: 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20   Btree *pBtree, 
4380: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4390: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
43a0: 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f   check */.  Pgno
43b0: 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20   pgnoRoot,      
43c0: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
43d0: 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63   that might be c
43e0: 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 36 34  hanging */.  i64
43f0: 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20   iRow,          
4400: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69       /* The rowi
4410: 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  d that might be 
4420: 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e  changing */.  in
4430: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20  t isClearTable  
4440: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
4450: 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65   all rows are be
4460: 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29  ing deleted */.)
4470: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
4480: 0a 20 20 69 66 28 20 70 42 74 72 65 65 2d 3e 68  .  if( pBtree->h
4490: 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 3d 3d 30  asIncrblobCur==0
44a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
44b0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
44c0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72  eHoldsMutex(pBtr
44d0: 65 65 29 20 29 3b 0a 20 20 70 42 74 72 65 65 2d  ee) );.  pBtree-
44e0: 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20  >hasIncrblobCur 
44f0: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  = 0;.  for(p=pBt
4500: 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
4510: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
4520: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 63  ){.    if( (p->c
4530: 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 49  urFlags & BTCF_I
4540: 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29 7b 0a 20  ncrblob)!=0 ){. 
4550: 20 20 20 20 20 70 42 74 72 65 65 2d 3e 68 61 73       pBtree->has
4560: 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 31 3b  IncrblobCur = 1;
4570: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67  .      if( p->pg
4580: 6e 6f 52 6f 6f 74 3d 3d 70 67 6e 6f 52 6f 6f 74  noRoot==pgnoRoot
4590: 20 26 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c   && (isClearTabl
45a0: 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65  e || p->info.nKe
45b0: 79 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20  y==iRow) ){.    
45c0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
45d0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
45e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
45f0: 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20  }.}..#else.  /* 
4600: 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77 68  Stub function wh
4610: 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f  en INCRBLOB is o
4620: 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65 66  mitted */.  #def
4630: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e  ine invalidateIn
4640: 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 77 2c  crblobCursors(w,
4650: 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a  x,y,z).#endif /*
4660: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4670: 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  RBLOB */../*.** 
4680: 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20  Set bit pgno of 
4690: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
46a0: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
46b0: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
46c0: 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20  .** when a page 
46d0: 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20  that previously 
46e0: 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62  contained data b
46f0: 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69  ecomes a free-li
4700: 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65  st leaf .** page
4710: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68  ..**.** The BtSh
4720: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4730: 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74   bitvec exists t
4740: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e  o work around an
4750: 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20   obscure.** bug 
4760: 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e  caused by the in
4770: 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f  teraction of two
4780: 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d   useful IO optim
4790: 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e  izations surroun
47a0: 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73  ding.** free-lis
47b0: 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a  t leaf pages:.**
47c0: 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c  .**   1) When al
47d0: 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65  l data is delete
47e0: 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e  d from a page an
47f0: 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d  d the page becom
4800: 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65  es.**      a fre
4810: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
4820: 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  , the page is no
4830: 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
4840: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
4850: 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20    (as free-list 
4860: 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61  leaf pages conta
4870: 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c  in no meaningful
4880: 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65   data). Sometime
4890: 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61  s.**      such a
48a0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65   page is not eve
48b0: 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73  n journalled (as
48c0: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
48d0: 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20  modified,.**    
48e0: 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75    why bother jou
48f0: 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a  rnalling it?)..*
4900: 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61  *.**   2) When a
4910: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4920: 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20  page is reused, 
4930: 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  its content is n
4940: 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ot read.**      
4950: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
4960: 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20  e or written to 
4970: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4980: 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a   (why should it.
4990: 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69  **      be, if i
49a0: 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  t is not at all 
49b0: 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a  meaningful?)..**
49c0: 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65  .** By themselve
49d0: 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a  s, these optimiz
49e0: 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65  ations work fine
49f0: 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68   and provide a h
4a00: 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61  andy.** performa
4a10: 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c  nce boost to bul
4a20: 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65  k delete or inse
4a30: 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48  rt operations. H
4a40: 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20  owever, if.** a 
4a50: 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f  page is moved to
4a60: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
4a70: 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77  nd then reused w
4a80: 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a  ithin the same.*
4a90: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  * transaction, a
4aa0: 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75   problem comes u
4ab0: 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  p. If the page i
4ac0: 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64  s not journalled
4ad0: 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d   when.** it is m
4ae0: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
4af0: 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20  -list and it is 
4b00: 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  also not journal
4b10: 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69  led when it.** i
4b20: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
4b30: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
4b40: 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20  nd reused, then 
4b50: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
4b60: 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74  a.** may be lost
4b70: 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  . In the event o
4b80: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74  f a rollback, it
4b90: 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73   may not be poss
4ba0: 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f  ible.** to resto
4bb0: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
4bc0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
4bd0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a  configuration..*
4be0: 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f  *.** The solutio
4bf0: 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65  n is the BtShare
4c00: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69  d.pHasContent bi
4c10: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
4c20: 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76   page is .** mov
4c30: 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66  ed to become a f
4c40: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4c50: 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ge, the correspo
4c60: 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20  nding bit is.** 
4c70: 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65  set in the bitve
4c80: 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65  c. Whenever a le
4c90: 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61  af page is extra
4ca0: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  cted from the fr
4cb0: 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69  ee-list,.** opti
4cc0: 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65  mization 2 above
4cd0: 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74   is omitted if t
4ce0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
4cf0: 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a   bit is already.
4d00: 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72  ** set in BtShar
4d10: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20  ed.pHasContent. 
4d20: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
4d30: 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63  the bitvec are c
4d40: 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65  leared.** at the
4d50: 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72   end of every tr
4d60: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
4d70: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65  atic int btreeSe
4d80: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
4d90: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
4da0: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20  pgno){.  int rc 
4db0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
4dc0: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
4dd0: 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65  tent ){.    asse
4de0: 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e  rt( pgno<=pBt->n
4df0: 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d  Page );.    pBt-
4e00: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73  >pHasContent = s
4e10: 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
4e20: 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  te(pBt->nPage);.
4e30: 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48      if( !pBt->pH
4e40: 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  asContent ){.   
4e50: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4e60: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
4e70: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
4e80: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f  QLITE_OK && pgno
4e90: 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  <=sqlite3BitvecS
4ea0: 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ize(pBt->pHasCon
4eb0: 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20  tent) ){.    rc 
4ec0: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
4ed0: 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  et(pBt->pHasCont
4ee0: 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ent, pgno);.  }.
4ef0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4f00: 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20  /*.** Query the 
4f10: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4f20: 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a  tent vector..**.
4f30: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
4f40: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
4f50: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4f60: 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64   page is removed
4f70: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65   from the.** fre
4f80: 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65  e-list for reuse
4f90: 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c  . It returns fal
4fa0: 73 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65  se if it is safe
4fb0: 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
4fc0: 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68  .** page from th
4fd0: 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69  e pager layer wi
4fe0: 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65  th the 'no-conte
4ff0: 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72  nt' flag set. Tr
5000: 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ue otherwise..*/
5010: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
5020: 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eGetHasContent(B
5030: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
5040: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76  no pgno){.  Bitv
5050: 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61  ec *p = pBt->pHa
5060: 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75  sContent;.  retu
5070: 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73  rn (p && (pgno>s
5080: 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65  qlite3BitvecSize
5090: 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  (p) || sqlite3Bi
50a0: 74 76 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f  tvecTest(p, pgno
50b0: 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  )));.}../*.** Cl
50c0: 65 61 72 20 28 64 65 73 74 72 6f 79 29 20 74 68  ear (destroy) th
50d0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
50e0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54  ontent bitvec. T
50f0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a  his should be.**
5100: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
5110: 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61  conclusion of ea
5120: 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ch write-transac
5130: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
5140: 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61 72 48  void btreeClearH
5150: 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72  asContent(BtShar
5160: 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
5170: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
5180: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
5190: 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43  t);.  pBt->pHasC
51a0: 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  ontent = 0;.}../
51b0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
51c0: 20 6f 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d   of the apPage[]
51d0: 20 70 61 67 65 73 20 66 6f 72 20 61 20 63 75 72   pages for a cur
51e0: 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sor..*/.static v
51f0: 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61 73 65  oid btreeRelease
5200: 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42  AllCursorPages(B
5210: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5220: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
5230: 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
5240: 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ge; i++){.    re
5250: 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
5260: 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
5270: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20  pCur->apPage[i] 
5280: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  = 0;.  }.  pCur-
5290: 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a  >iPage = -1;.}..
52a0: 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  /*.** The cursor
52b0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
52c0: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 6d 75 73  nly argument mus
52d0: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c  t point to a val
52e0: 69 64 20 65 6e 74 72 79 0a 2a 2a 20 77 68 65 6e  id entry.** when
52f0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
5300: 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 20 68  s called (i.e. h
5310: 61 76 65 20 65 53 74 61 74 65 3d 3d 43 55 52 53  ave eState==CURS
5320: 4f 52 5f 56 41 4c 49 44 29 2e 20 54 68 69 73 0a  OR_VALID). This.
5330: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 61 76 65  ** function save
5340: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  s the current cu
5350: 72 73 6f 72 20 6b 65 79 20 69 6e 20 76 61 72 69  rsor key in vari
5360: 61 62 6c 65 73 20 70 43 75 72 2d 3e 6e 4b 65 79  ables pCur->nKey
5370: 20 61 6e 64 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b   and.** pCur->pK
5380: 65 79 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ey. SQLITE_OK is
5390: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63   returned if suc
53a0: 63 65 73 73 66 75 6c 20 6f 72 20 61 6e 20 53 51  cessful or an SQ
53b0: 4c 69 74 65 20 65 72 72 6f 72 20 0a 2a 2a 20 63  Lite error .** c
53c0: 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
53d0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73  *.** If the curs
53e0: 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 6e  or is open on an
53f0: 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74   intkey table, t
5400: 68 65 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20  hen the integer 
5410: 6b 65 79 0a 2a 2a 20 28 74 68 65 20 72 6f 77 69  key.** (the rowi
5420: 64 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  d) is stored in 
5430: 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 20 70  pCur->nKey and p
5440: 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 6c 65 66  Cur->pKey is lef
5450: 74 20 73 65 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c  t set to.** NULL
5460: 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  . If the cursor 
5470: 69 73 20 6f 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e  is open on a non
5480: 2d 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74  -intkey table, t
5490: 68 65 6e 20 70 43 75 72 2d 3e 70 4b 65 79 20 69  hen pCur->pKey i
54a0: 73 20 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69  s .** set to poi
54b0: 6e 74 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 65 64  nt to a malloced
54c0: 20 62 75 66 66 65 72 20 70 43 75 72 2d 3e 6e 4b   buffer pCur->nK
54d0: 65 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ey bytes in size
54e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20   containing .** 
54f0: 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74  the key..*/.stat
5500: 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f  ic int saveCurso
5510: 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  rKey(BtCursor *p
5520: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Cur){.  int rc =
5530: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
5540: 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
5550: 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
5560: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
5570: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
5580: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
5590: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
55a0: 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
55b0: 63 75 72 49 6e 74 4b 65 79 20 29 7b 0a 20 20 20  curIntKey ){.   
55c0: 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 72 6f 77   /* Only the row
55d0: 69 64 20 69 73 20 72 65 71 75 69 72 65 64 20 66  id is required f
55e0: 6f 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  or a table btree
55f0: 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b   */.    pCur->nK
5600: 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
5610: 65 49 6e 74 65 67 65 72 4b 65 79 28 70 43 75 72  eIntegerKey(pCur
5620: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5630: 2f 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20  /* For an index 
5640: 62 74 72 65 65 2c 20 73 61 76 65 20 74 68 65 20  btree, save the 
5650: 63 6f 6d 70 6c 65 74 65 20 6b 65 79 20 63 6f 6e  complete key con
5660: 74 65 6e 74 20 2a 2f 0a 20 20 20 20 76 6f 69 64  tent */.    void
5670: 20 2a 70 4b 65 79 3b 0a 20 20 20 20 70 43 75 72   *pKey;.    pCur
5680: 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ->nKey = sqlite3
5690: 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65  BtreePayloadSize
56a0: 28 70 43 75 72 29 3b 0a 20 20 20 20 70 4b 65 79  (pCur);.    pKey
56b0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
56c0: 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a  ( pCur->nKey );.
56d0: 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
56e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
56f0: 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 70  e3BtreePayload(p
5700: 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43 75  Cur, 0, (int)pCu
5710: 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b 0a  r->nKey, pKey);.
5720: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
5730: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
5740: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
5750: 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pKey;.      }els
5760: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
5770: 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a 20  e3_free(pKey);. 
5780: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
5790: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
57a0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
57b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
57c0: 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72 49 6e  rt( !pCur->curIn
57d0: 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70  tKey || !pCur->p
57e0: 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  Key );.  return 
57f0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  rc;.}../*.** Sav
5800: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
5810: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
5820: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
5830: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
5840: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
5850: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
5860: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
5870: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
5880: 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  EEK..**.** The c
5890: 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
58a0: 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
58b0: 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20  r is valid (has 
58c0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
58d0: 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74  ALID).** prior t
58e0: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
58f0: 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61  outine.  .*/.sta
5900: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
5910: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
5920: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
5930: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
5940: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
5950: 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c 20 43  Cur->eState || C
5960: 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d  URSOR_SKIPNEXT==
5970: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5980: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5990: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
59a0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
59b0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
59c0: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
59d0: 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
59e0: 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  EXT ){.    pCur-
59f0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5a00: 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 7b  _VALID;.  }else{
5a10: 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e  .    pCur->skipN
5a20: 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ext = 0;.  }..  
5a30: 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 4b  rc = saveCursorK
5a40: 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ey(pCur);.  if( 
5a50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5a60: 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73  .    btreeReleas
5a70: 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
5a80: 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75 72 2d  pCur);.    pCur-
5a90: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5aa0: 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20  _REQUIRESEEK;.  
5ab0: 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  }..  pCur->curFl
5ac0: 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
5ad0: 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
5ae0: 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74 4c 61  idOvfl|BTCF_AtLa
5af0: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  st);.  return rc
5b00: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
5b10: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
5b20: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
5b30: 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73  OINLINE saveCurs
5b40: 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75 72 73  orsOnList(BtCurs
5b50: 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f  or*,Pgno,BtCurso
5b60: 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  r*);../*.** Save
5b70: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
5b80: 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 28 65  f all cursors (e
5b90: 78 63 65 70 74 20 70 45 78 63 65 70 74 29 20 74  xcept pExcept) t
5ba0: 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a  hat are open on.
5bb0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  ** the table wit
5bc0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f  h root-page iRoo
5bd0: 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68 65 20  t.  "Saving the 
5be0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 22  cursor position"
5bf0: 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74   means that.** t
5c00: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  he location in t
5c10: 68 65 20 62 74 72 65 65 20 69 73 20 72 65 6d 65  he btree is reme
5c20: 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68 20 61  mbered in such a
5c30: 20 77 61 79 20 74 68 61 74 20 69 74 20 63 61 6e   way that it can
5c40: 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62 61 63   be.** moved bac
5c50: 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 70  k to the same sp
5c60: 6f 74 20 61 66 74 65 72 20 74 68 65 20 62 74 72  ot after the btr
5c70: 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ee has been modi
5c80: 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  fied.  This.** r
5c90: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
5ca0: 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72   just before cur
5cb0: 73 6f 72 20 70 45 78 63 65 70 74 20 69 73 20 75  sor pExcept is u
5cc0: 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  sed to modify th
5cd0: 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f 72 20  e.** table, for 
5ce0: 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72 65 65  example in Btree
5cf0: 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
5d00: 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a  eInsert()..**.**
5d10: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77   If there are tw
5d20: 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72  o or more cursor
5d30: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74  s on the same bt
5d40: 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75  ree, then all su
5d50: 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73  ch .** cursors s
5d60: 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65 69 72  hould have their
5d70: 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66   BTCF_Multiple f
5d80: 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20 62 74  lag set.  The bt
5d90: 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a 20 72  reeCursor().** r
5da0: 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65 73 20  outine enforces 
5db0: 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68 69 73  that rule.  This
5dc0: 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 6e 65   routine only ne
5dd0: 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  eds to be called
5de0: 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63 6f 6d   in.** the uncom
5df0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20 70 45  mon case when pE
5e00: 78 70 65 63 74 20 68 61 73 20 74 68 65 20 42 54  xpect has the BT
5e10: 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
5e20: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70   set..**.** If p
5e30: 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61 6e 64  Expect!=NULL and
5e40: 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63 75 72   if no other cur
5e50: 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64 20 6f  sors are found o
5e60: 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 2d  n the same root-
5e70: 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  page,.** then th
5e80: 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
5e90: 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63 74 20  flag on pExpect 
5ea0: 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f 20 61  is cleared, to a
5eb0: 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a 2a 20  void another.** 
5ec0: 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c 20 74  pointless call t
5ed0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  o this routine..
5ee0: 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  **.** Implementa
5ef0: 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73  tion note:  This
5f00: 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20   routine merely 
5f10: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
5f20: 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20   any cursors.** 
5f30: 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64  need to be saved
5f40: 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75 74 20  .  It calls out 
5f50: 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e  to saveCursorsOn
5f60: 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20 28 75  List() in the (u
5f70: 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74  nusual).** event
5f80: 20 74 68 61 74 20 63 75 72 73 6f 72 73 20 61 72   that cursors ar
5f90: 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62 65 69  e in need to bei
5fa0: 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61  ng saved..*/.sta
5fb0: 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43  tic int saveAllC
5fc0: 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
5fd0: 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74  *pBt, Pgno iRoot
5fe0: 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63  , BtCursor *pExc
5ff0: 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ept){.  BtCursor
6000: 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *p;.  assert( s
6010: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6020: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
6030: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65  .  assert( pExce
6040: 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74  pt==0 || pExcept
6050: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20  ->pBt==pBt );.  
6060: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
6070: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
6080: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70  t){.    if( p!=p
6090: 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52  Except && (0==iR
60a0: 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f  oot || p->pgnoRo
60b0: 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62 72 65  ot==iRoot) ) bre
60c0: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20  ak;.  }.  if( p 
60d0: 29 20 72 65 74 75 72 6e 20 73 61 76 65 43 75 72  ) return saveCur
60e0: 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52  sorsOnList(p, iR
60f0: 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b 0a 20  oot, pExcept);. 
6100: 20 69 66 28 20 70 45 78 63 65 70 74 20 29 20 70   if( pExcept ) p
6110: 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61 67 73  Except->curFlags
6120: 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74 69 70   &= ~BTCF_Multip
6130: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
6140: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68  ITE_OK;.}../* Th
6150: 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e  is helper routin
6160: 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75 72 73  e to saveAllCurs
6170: 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61 63 74  ors does the act
6180: 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61 76 69  ual work of savi
6190: 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  ng.** the cursor
61a0: 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20 61 20  s if and when a 
61b0: 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e 64 20  cursor is found 
61c0: 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20 72 65  that actually re
61d0: 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e 0a 2a  quires saving..*
61e0: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
61f0: 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63 75 72  e is that no cur
6200: 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20  sors need to be 
6210: 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73 20 72  saved, so this r
6220: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62 72 6f  outine is.** bro
6230: 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69 74 73  ken out from its
6240: 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f 69 64   caller to avoid
6250: 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 74 61   unnecessary sta
6260: 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76 65 6d  ck pointer movem
6270: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
6280: 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  nt SQLITE_NOINLI
6290: 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e  NE saveCursorsOn
62a0: 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73 6f 72  List(.  BtCursor
62b0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *p,         /* 
62c0: 54 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72  The first cursor
62d0: 20 74 68 61 74 20 6e 65 65 64 73 20 73 61 76 69   that needs savi
62e0: 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f  ng */.  Pgno iRo
62f0: 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ot,          /* 
6300: 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73 6f 72  Only save cursor
6310: 20 77 69 74 68 20 74 68 69 73 20 69 52 6f 6f 74   with this iRoot
6320: 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20 7a 65  . Save all if ze
6330: 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  ro */.  BtCursor
6340: 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f 2a 20   *pExcept    /* 
6350: 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68 69 73  Do not save this
6360: 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
6370: 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70  do{.    if( p!=p
6380: 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52  Except && (0==iR
6390: 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f  oot || p->pgnoRo
63a0: 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20  ot==iRoot) ){.  
63b0: 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
63c0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
63d0: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  || p->eState==CU
63e0: 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b  RSOR_SKIPNEXT ){
63f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
6400: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
6410: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20  tion(p);.       
6420: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
6430: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
6440: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
6450: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
6460: 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
6470: 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29  se( p->iPage>0 )
6480: 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 52  ;.        btreeR
6490: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
64a0: 61 67 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d  ages(p);.      }
64b0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
64c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c  ->pNext;.  }whil
64d0: 65 28 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e  e( p );.  return
64e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
64f0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
6500: 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
6510: 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  sition..*/.void 
6520: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
6530: 72 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  rCursor(BtCursor
6540: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
6550: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
6560: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73  tex(pCur) );.  s
6570: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
6580: 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d  ->pKey);.  pCur-
6590: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75  >pKey = 0;.  pCu
65a0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
65b0: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f  OR_INVALID;.}../
65c0: 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72  *.** In this ver
65d0: 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76  sion of BtreeMov
65e0: 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70  eto, pKey is a p
65f0: 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f  acked index reco
6600: 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73  rd.** such as is
6610: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
6620: 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
6630: 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20  opcode.  Unpack 
6640: 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e  the.** record an
6650: 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65  d then call Btre
6660: 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
6670: 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  ) to do the work
6680: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6690: 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42  btreeMoveto(.  B
66a0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
66b0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65     /* Cursor ope
66c0: 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74  n on the btree t
66d0: 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f  o be searched */
66e0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
66f0: 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64  Key,   /* Packed
6700: 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65   key if the btre
6710: 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  e is an index */
6720: 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  .  i64 nKey,    
6730: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
6740: 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73  r key for tables
6750: 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20  .  Size of pKey 
6760: 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  for indices */. 
6770: 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20   int bias,      
6780: 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61       /* Bias sea
6790: 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20  rch to the high 
67a0: 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  end */.  int *pR
67b0: 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  es           /* 
67c0: 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
67d0: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
67e0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6800: 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20  Status code */. 
6810: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
6820: 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55  *pIdxKey;   /* U
6830: 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
6840: 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79  y */..  if( pKey
6850: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
6860: 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29  nKey==(i64)(int)
6870: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78  nKey );.    pIdx
6880: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
6890: 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65  eAllocUnpackedRe
68a0: 63 6f 72 64 28 70 43 75 72 2d 3e 70 4b 65 79 49  cord(pCur->pKeyI
68b0: 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28 20 70 49  nfo);.    if( pI
68c0: 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  dxKey==0 ) retur
68d0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
68e0: 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  KPT;.    sqlite3
68f0: 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
6900: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c  (pCur->pKeyInfo,
6910: 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79   (int)nKey, pKey
6920: 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
6930: 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69  if( pIdxKey->nFi
6940: 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eld==0 ){.      
6950: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
6960: 55 50 54 5f 50 47 4e 4f 28 70 43 75 72 2d 3e 61  UPT_PGNO(pCur->a
6970: 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
6980: 65 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e]->pgno);.     
6990: 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e   goto moveto_don
69a0: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  e;.    }.  }else
69b0: 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  {.    pIdxKey = 
69c0: 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  0;.  }.  rc = sq
69d0: 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
69e0: 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70  Unpacked(pCur, p
69f0: 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69  IdxKey, nKey, bi
6a00: 61 73 2c 20 70 52 65 73 29 3b 0a 6d 6f 76 65 74  as, pRes);.movet
6a10: 6f 5f 64 6f 6e 65 3a 0a 20 20 69 66 28 20 70 49  o_done:.  if( pI
6a20: 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  dxKey ){.    sql
6a30: 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d  ite3DbFree(pCur-
6a40: 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70  >pKeyInfo->db, p
6a50: 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72  IdxKey);.  }.  r
6a60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6a70: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
6a80: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
6a90: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
6aa0: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
6ab0: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
6ac0: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
6ad0: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
6ae0: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
6af0: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
6b00: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
6b10: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
6b20: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
6b30: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
6b40: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
6b50: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
6b60: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75  ective restoreCu
6b70: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
6b80: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
6b90: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
6ba0: 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74  ition()..*/.stat
6bb0: 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73 74  ic int btreeRest
6bc0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6bd0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
6be0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
6bf0: 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 61  nt skipNext;.  a
6c00: 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
6c10: 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
6c20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
6c30: 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
6c40: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
6c50: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
6c60: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
6c70: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
6c80: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a  pCur->skipNext;.
6c90: 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61    }.  pCur->eSta
6ca0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
6cb0: 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  LID;.  rc = btre
6cc0: 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43  eMoveto(pCur, pC
6cd0: 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e  ur->pKey, pCur->
6ce0: 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65  nKey, 0, &skipNe
6cf0: 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  xt);.  if( rc==S
6d00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6d10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
6d20: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43  r->pKey);.    pC
6d30: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
6d40: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
6d50: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
6d60: 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
6d70: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
6d80: 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43 75 72  ALID );.    pCur
6d90: 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b  ->skipNext |= sk
6da0: 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  ipNext;.    if( 
6db0: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26  pCur->skipNext &
6dc0: 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
6dd0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
6de0: 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
6df0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50  te = CURSOR_SKIP
6e00: 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NEXT;.    }.  }.
6e10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6e20: 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43  #define restoreC
6e30: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
6e40: 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e   \.  (p->eState>
6e50: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
6e60: 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20  EEK ? \.        
6e70: 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72   btreeRestoreCur
6e80: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a  sorPosition(p) :
6e90: 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49   \.         SQLI
6ea0: 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  TE_OK)../*.** De
6eb0: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
6ec0: 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20  or not a cursor 
6ed0: 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74  has moved from t
6ee0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68 65 72  he position wher
6ef0: 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61 73 74  e.** it was last
6f00: 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61 73 20   placed, or has 
6f10: 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 64  been invalidated
6f20: 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 72   for any other r
6f30: 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72  eason..** Cursor
6f40: 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20  s can move when 
6f50: 74 68 65 20 72 6f 77 20 74 68 65 79 20 61 72 65  the row they are
6f60: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69 73 20   pointing at is 
6f70: 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66  deleted out.** f
6f80: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2c 20  rom under them, 
6f90: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 43 75  for example.  Cu
6fa0: 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73 6f 20  rsor might also 
6fb0: 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65 65 0a  move if a btree.
6fc0: 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63 65 64  ** is rebalanced
6fd0: 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20  ..**.** Calling 
6fe0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
6ff0: 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20  h a NULL cursor 
7000: 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 73 20  pointer returns 
7010: 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  false..**.** Use
7020: 20 74 68 65 20 73 65 70 61 72 61 74 65 20 73 71   the separate sq
7030: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7040: 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74 69 6e  Restore() routin
7050: 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 63  e to restore a c
7060: 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f  ursor.** back to
7070: 20 77 68 65 72 65 20 69 74 20 6f 75 67 68 74 20   where it ought 
7080: 74 6f 20 62 65 20 69 66 20 74 68 69 73 20 72 6f  to be if this ro
7090: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72  utine returns tr
70a0: 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ue..*/.int sqlit
70b0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
70c0: 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a  Moved(BtCursor *
70d0: 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
70e0: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
70f0: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f  RSOR_VALID;.}../
7100: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7110: 65 20 72 65 73 74 6f 72 65 73 20 61 20 63 75 72  e restores a cur
7120: 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20  sor back to its 
7130: 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f  original positio
7140: 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20 68 61  n after it.** ha
7150: 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62 79 20  s been moved by 
7160: 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61 63 74  some outside act
7170: 69 76 69 74 79 20 28 73 75 63 68 20 61 73 20 61  ivity (such as a
7180: 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e 63 65   btree rebalance
7190: 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76   or.** a row hav
71a0: 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ing been deleted
71b0: 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
71c0: 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a  the cursor).  .*
71d0: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
71e0: 20 74 68 65 20 2a 70 44 69 66 66 65 72 65 6e 74   the *pDifferent
71f0: 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 69 73  Row parameter is
7200: 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 63 75   false if the cu
7210: 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20  rsor is left.** 
7220: 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78 61 63  pointing at exac
7230: 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72 6f 77  tly the same row
7240: 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52 6f 77  .  *pDifferntRow
7250: 20 69 73 20 74 68 65 20 72 6f 77 20 74 68 65 20   is the row the 
7260: 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f  cursor.** was po
7270: 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20 62 65  inting to has be
7280: 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f 72 63  en deleted, forc
7290: 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
72a0: 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a  o point to some.
72b0: 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a  ** nearby row..*
72c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
72d0: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
72e0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 63 75   called for a cu
72f0: 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74 20 72  rsor that just r
7300: 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20  eturned.** TRUE 
7310: 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65  from sqlite3Btre
7320: 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
7330: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
7340: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
7350: 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ore(BtCursor *pC
7360: 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66 65 72  ur, int *pDiffer
7370: 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72  entRow){.  int r
7380: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  c;..  assert( pC
7390: 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ur!=0 );.  asser
73a0: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  t( pCur->eState!
73b0: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
73c0: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
73d0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
73e0: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
73f0: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
7400: 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Row = 1;.    ret
7410: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
7420: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
7430: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
7440: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
7450: 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 1;.  }else{
7460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
7470: 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29  r->skipNext==0 )
7480: 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  ;.    *pDifferen
7490: 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  tRow = 0;.  }.  
74a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
74b0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
74c0: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
74d0: 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f  _HINTS./*.** Pro
74e0: 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74 68  vide hints to th
74f0: 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 70  e cursor.  The p
7500: 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20 67  articular hint g
7510: 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74 79  iven (and the ty
7520: 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65 72  pe.** and number
7530: 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73 20   of the varargs 
7540: 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20 64  parameters) is d
7550: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
7560: 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70 61   eHintType.** pa
7570: 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74 68  rameter.  See th
7580: 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66  e definitions of
7590: 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54 5f   the BTREE_HINT_
75a0: 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65 74  * macros for det
75b0: 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ails..*/.void sq
75c0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
75d0: 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Hint(BtCursor *p
75e0: 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54 79  Cur, int eHintTy
75f0: 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55  pe, ...){.  /* U
7600: 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73 74  sed only by syst
7610: 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74 75  em that substitu
7620: 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74 6f  te their own sto
7630: 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d  rage engine */.}
7640: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
7650: 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e 74  rovide flag hint
7660: 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e  s to the cursor.
7670: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7680: 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74 46  BtreeCursorHintF
7690: 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70  lags(BtCursor *p
76a0: 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78 29  Cur, unsigned x)
76b0: 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d 42  {.  assert( x==B
76c0: 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20  TREE_SEEK_EQ || 
76d0: 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41  x==BTREE_BULKLOA
76e0: 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20 70  D || x==0 );.  p
76f0: 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b 0a  Cur->hints = x;.
7700: 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
7710: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
7720: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
7730: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
7740: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
7750: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
7760: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
7770: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
7780: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
7790: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
77a0: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
77b0: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
77c0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
77d0: 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61   (not a valid pa
77e0: 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20  ge) for pgno==1 
77f0: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a  since there is.*
7800: 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70  * no pointer map
7810: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7820: 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e   page 1.  The in
7830: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f  tegrity_check lo
7840: 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20  gic.** requires 
7850: 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e  that ptrmapPagen
7860: 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74  o(*,1)!=1..*/.st
7870: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
7880: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
7890: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
78a0: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
78b0: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
78c0: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
78d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
78e0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
78f0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
7900: 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e   pgno<2 ) return
7910: 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d   0;.  nPagesPerM
7920: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
7930: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
7940: 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e    iPtrMap = (pgn
7950: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
7960: 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28  pPage;.  ret = (
7970: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
7980: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
7990: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
79a0: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
79b0: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
79c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
79d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
79e0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
79f0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
7a00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7a10: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
7a20: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
7a30: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
7a40: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
7a50: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
7a60: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
7a70: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
7a80: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49   'pgno'..**.** I
7a90: 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61  f *pRC is initia
7aa0: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f  lly non-zero (no
7ab0: 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65  n-SQLITE_OK) the
7ac0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
7ad0: 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  s.** a no-op.  I
7ae0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7af0: 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  s, the appropria
7b00: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
7b10: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
7b20: 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63   *pRC..*/.static
7b30: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28   void ptrmapPut(
7b40: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
7b50: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
7b60: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20  e, Pgno parent, 
7b70: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50  int *pRC){.  DbP
7b80: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
7b90: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
7ba0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
7bb0: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
7bc0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
7bd0: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
7be0: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
7bf0: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
7c00: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
7c10: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
7c20: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
7c30: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7c40: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
7c50: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
7c60: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  n code from subf
7c70: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
7c80: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
7c90: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
7ca0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7cb0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7cc0: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
7cd0: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
7ce0: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
7cf0: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
7d00: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7d10: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
7d20: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
7d30: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
7d40: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
7d50: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
7d60: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
7d70: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  y==0 ){.    *pRC
7d80: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7d90: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
7da0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  rn;.  }.  iPtrma
7db0: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
7dc0: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
7dd0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7de0: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
7df0: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
7e00: 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ge, 0);.  if( rc
7e10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
7e20: 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20     *pRC = rc;.  
7e30: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7e40: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
7e50: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
7e60: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
7e70: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a  ffset<0 ){.    *
7e80: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
7e90: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
7ea0: 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b  oto ptrmap_exit;
7eb0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
7ec0: 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42  ffset <= (int)pB
7ed0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20  t->usableSize-5 
7ee0: 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28  );.  pPtrmap = (
7ef0: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
7f00: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
7f10: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
7f20: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
7f30: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
7f40: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
7f50: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
7f60: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
7f70: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
7f80: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
7f90: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
7fa0: 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69   *pRC= rc = sqli
7fb0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
7fc0: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
7fd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7fe0: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
7ff0: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
8000: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
8010: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
8020: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
8030: 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78  }.  }..ptrmap_ex
8040: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  it:.  sqlite3Pag
8050: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
8060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
8070: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
8080: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
8090: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
80a0: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
80b0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
80c0: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
80d0: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
80e0: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
80f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
8100: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
8110: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
8120: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
8130: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
8140: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
8150: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
8160: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
8170: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
8180: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
8190: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
81a0: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
81b0: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
81c0: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
81d0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
81e0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
81f0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
8200: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
8210: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
8220: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
8230: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
8240: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
8250: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
8260: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
8270: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
8280: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
8290: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
82a0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
82b0: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
82c0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
82d0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
82e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
82f0: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
8300: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
8310: 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66  DbPage, 0);.  if
8320: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
8330: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
8340: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
8350: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
8360: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
8370: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
8380: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
8390: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20  ap, key);.  if( 
83a0: 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20  offset<0 ){.    
83b0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
83c0: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
83d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
83e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
83f0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
8400: 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
8410: 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20  ableSize-5 );.  
8420: 61 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d  assert( pEType!=
8430: 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d  0 );.  *pEType =
8440: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
8450: 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20  ;.  if( pPgno ) 
8460: 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  *pPgno = get4byt
8470: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
8480: 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  t+1]);..  sqlite
8490: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
84a0: 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54  age);.  if( *pET
84b0: 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65  ype<1 || *pEType
84c0: 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >5 ) return SQLI
84d0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
84e0: 69 50 74 72 6d 61 70 29 3b 0a 20 20 72 65 74 75  iPtrmap);.  retu
84f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8500: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
8510: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
8520: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
8530: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
8540: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
8550: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
8560: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
8570: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
8580: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
8590: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
85a0: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
85b0: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
85c0: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
85d0: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
85e0: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
85f0: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
8600: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
8610: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
8620: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
8630: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
8640: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43  ent..**.** findC
8650: 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f 65  ellPastPtr() doe
8660: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
8670: 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74 20  t it skips past 
8680: 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34  the initial.** 4
8690: 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
86a0: 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74  ter found on int
86b0: 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66 20  erior pages, if 
86c0: 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a  there is one..**
86d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
86e0: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
86f0: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
8700: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
8710: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
8720: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
8730: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
8740: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
8750: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41 6c  age & get2byteAl
8760: 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c  igned(&(P)->aCel
8770: 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23  lIdx[2*(I)]))).#
8780: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50  define findCellP
8790: 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20 20  astPtr(P,I) \.  
87a0: 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74 20  ((P)->aDataOfst 
87b0: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
87c0: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
87d0: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
87e0: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a  x[2*(I)]))).../*
87f0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d 6d  .** This is comm
8800: 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73 69  on tail processi
8810: 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72 73  ng for btreePars
8820: 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a  eCellPtr() and.*
8830: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
8840: 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20 74  PtrIndex() for t
8850: 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  he case when the
8860: 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66   cell does not f
8870: 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f  it entirely.** o
8880: 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72 65  n a single B-tre
8890: 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65  e page.  Make ne
88a0: 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65  cessary adjustme
88b0: 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c 49  nts to the CellI
88c0: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
88d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
88e0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
88f0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
8900: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
8910: 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65 20  flow(.  MemPage 
8920: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
8930: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
8940: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
8950: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
8960: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8970: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
8980: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
8990: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
89a0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
89b0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
89c0: 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ){.  /* If the p
89d0: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
89e0: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
89f0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
8a00: 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  , we have.  ** t
8a10: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
8a20: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
8a30: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
8a40: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
8a50: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
8a60: 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79  s.  The strategy
8a70: 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20   is to minimize 
8a80: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e  the amount of un
8a90: 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65 20  used.  ** space 
8aa0: 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
8ab0: 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20  s while keeping 
8ac0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f  the amount of lo
8ad0: 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a  cal storage.  **
8ae0: 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c   in between minL
8af0: 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61  ocal and maxLoca
8b00: 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72  l..  **.  ** War
8b10: 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20  ning:  changing 
8b20: 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77  the way overflow
8b30: 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74   payload is dist
8b40: 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20  ributed in any. 
8b50: 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73   ** way will res
8b60: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  ult in an incomp
8b70: 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d  atible file form
8b80: 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d  at..  */.  int m
8b90: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
8ba0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8bb0: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8bc0: 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78  lly */.  int max
8bd0: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d  Local;  /* Maxim
8be0: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
8bf0: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
8c00: 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c  y */.  int surpl
8c10: 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  us;   /* Overflo
8c20: 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61  w payload availa
8c30: 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74  ble for local st
8c40: 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c  orage */..  minL
8c50: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
8c60: 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63  nLocal;.  maxLoc
8c70: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
8c80: 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20  ocal;.  surplus 
8c90: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49  = minLocal + (pI
8ca0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20  nfo->nPayload - 
8cb0: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
8cc0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8cd0: 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65  e-4);.  testcase
8ce0: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
8cf0: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8d00: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
8d10: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
8d20: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
8d30: 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  cal ){.    pInfo
8d40: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
8d50: 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65  surplus;.  }else
8d60: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  {.    pInfo->nLo
8d70: 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f  cal = (u16)minLo
8d80: 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  cal;.  }.  pInfo
8d90: 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 28  ->nSize = (u16)(
8da0: 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64  &pInfo->pPayload
8db0: 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20  [pInfo->nLocal] 
8dc0: 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a  - pCell) + 4;.}.
8dd0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
8de0: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
8df0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
8e00: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
8e10: 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a  .xParseCell().**
8e20: 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50   method..**.** P
8e30: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
8e40: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
8e50: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
8e60: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  fo structure..**
8e70: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
8e80: 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20 20 3d  llPtr()        =
8e90: 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20  >   table btree 
8ea0: 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74  leaf nodes.** bt
8eb0: 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61  reeParseCellNoPa
8ec0: 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20 74 61  yload()  =>   ta
8ed0: 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65 72 6e  ble btree intern
8ee0: 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65  al nodes.** btre
8ef0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
8f00: 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e 64 65  ex()   =>   inde
8f10: 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a  x btree nodes.**
8f20: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 6c 73  .** There is als
8f30: 6f 20 61 20 77 72 61 70 70 65 72 20 66 75 6e 63  o a wrapper func
8f40: 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73 65 43  tion btreeParseC
8f50: 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73  ell() that works
8f60: 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50   for.** all MemP
8f70: 61 67 65 20 74 79 70 65 73 20 61 6e 64 20 74 68  age types and th
8f80: 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 74 68  at references th
8f90: 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65 78 20  e cell by index 
8fa0: 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62  rather than.** b
8fb0: 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  y pointer..*/.st
8fc0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
8fd0: 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79  arseCellPtrNoPay
8fe0: 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67 65 20  load(.  MemPage 
8ff0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
9000: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
9010: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
9020: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
9030: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
9040: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
9050: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
9060: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
9070: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
9080: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
9090: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
90a0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
90b0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
90c0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
90d0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29  pPage->leaf==0 )
90e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
90f0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
9100: 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =4 );.#ifndef SQ
9110: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55 4e 55  LITE_DEBUG.  UNU
9120: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
9130: 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  age);.#endif.  p
9140: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20  Info->nSize = 4 
9150: 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70 43 65  + getVarint(&pCe
9160: 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26 70 49  ll[4], (u64*)&pI
9170: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49  nfo->nKey);.  pI
9180: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
9190: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  0;.  pInfo->nLoc
91a0: 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  al = 0;.  pInfo-
91b0: 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  >pPayload = 0;. 
91c0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69   return;.}.stati
91d0: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
91e0: 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50  eCellPtr(.  MemP
91f0: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
9200: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
9210: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
9220: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
9230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9240: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
9250: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
9260: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
9270: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
9280: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
9290: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74   */.){.  u8 *pIt
92a0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
92b0: 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67   /* For scanning
92c0: 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a   through pCell *
92d0: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
92e0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
92f0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
9300: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
9310: 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20 20 20  /.  u64 iKey;   
9320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
9330: 78 74 72 61 63 74 65 64 20 4b 65 79 20 76 61 6c  xtracted Key val
9340: 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ue */..  assert(
9350: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9360: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9370: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9380: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
9390: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
93a0: 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  f==1 );.  assert
93b0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
93c0: 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eaf );.  assert(
93d0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
93e0: 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74  Size==0 );.  pIt
93f0: 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f  er = pCell;..  /
9400: 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  * The next block
9410: 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69   of code is equi
9420: 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a  valent to:.  **.
9430: 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b    **     pIter +
9440: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
9450: 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  ter, nPayload);.
9460: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f    **.  ** The co
9470: 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f  de is inlined to
9480: 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f   avoid a functio
9490: 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e  n call..  */.  n
94a0: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
94b0: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
94c0: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
94d0: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
94e0: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
94f0: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
9500: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
9510: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
9520: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
9530: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
9540: 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38 30  ( (*pIter)>=0x80
9550: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
9560: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
9570: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
9580: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
9590: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
95a0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
95b0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
95c0: 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26 70  (pIter, (u64*)&p
95d0: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a  Info->nKey);.  *
95e0: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
95f0: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
9600: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
9610: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79  all..  */.  iKey
9620: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
9630: 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20   iKey>=0x80 ){. 
9640: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9650: 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65  Iter[7];.    iKe
9660: 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 77  y &= 0x7f;.    w
9670: 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20 69  hile(1){.      i
9680: 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20  Key = (iKey<<7) 
9690: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
96a0: 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  7f);.      if( (
96b0: 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20 62  *pIter)<0x80 ) b
96c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
96d0: 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20  pIter>=pEnd ){. 
96e0: 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69         iKey = (i
96f0: 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74  Key<<8) | *++pIt
9700: 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  er;.        brea
9710: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9720: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
9730: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
9740: 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20   *(i64*)&iKey;. 
9750: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
9760: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
9770: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
9780: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
9790: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
97a0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
97b0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
97c0: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
97d0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
97e0: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
97f0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
9800: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
9810: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
9820: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
9830: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
9840: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
9850: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
9860: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
9870: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
9880: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
9890: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
98a0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
98b0: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
98c0: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
98d0: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
98e0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
98f0: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
9900: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
9910: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
9920: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
9930: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
9940: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
9950: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
9960: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
9970: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
9980: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
9990: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
99a0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
99b0: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
99c0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
99d0: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
99e0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
99f0: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
9a00: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
9a10: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
9a20: 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20  u8 *pIter;      
9a30: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73          /* For s
9a40: 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
9a50: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e  pCell */.  u32 n
9a60: 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20  Payload;        
9a70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9a80: 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61  bytes of cell pa
9a90: 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65  yload */..  asse
9aa0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9ab0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
9ac0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
9ad0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
9ae0: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
9af0: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73  leaf==1 );.  ass
9b00: 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
9b10: 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70  eyLeaf==0 );.  p
9b20: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
9b30: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
9b40: 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d  ze;.  nPayload =
9b50: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
9b60: 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b  Payload>=0x80 ){
9b70: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
9b80: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
9b90: 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b  Payload &= 0x7f;
9ba0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
9bb0: 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c  Payload = (nPayl
9bc0: 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  oad<<7) | (*++pI
9bd0: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
9be0: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
9bf0: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
9c00: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
9c10: 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d  Iter++;.  pInfo-
9c20: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
9c30: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  ;.  pInfo->nPayl
9c40: 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  oad = nPayload;.
9c50: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
9c60: 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73  d = pIter;.  tes
9c70: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
9c80: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9c90: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9ca0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9cb0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
9cc0: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
9cd0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
9ce0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
9cf0: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
9d00: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
9d10: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
9d20: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
9d30: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
9d40: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
9d50: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
9d60: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
9d70: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28  e = nPayload + (
9d80: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
9d90: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ll);.    if( pIn
9da0: 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49  fo->nSize<4 ) pI
9db0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
9dc0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
9dd0: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
9de0: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
9df0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64  btreeParseCellAd
9e00: 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66  justSizeForOverf
9e10: 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  low(pPage, pCell
9e20: 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a  , pInfo);.  }.}.
9e30: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9e40: 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65  eParseCell(.  Me
9e50: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
9e60: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
9e70: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
9e80: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
9e90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9ea0: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
9eb0: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
9ec0: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
9ed0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9ee0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9ef0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9f00: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
9f10: 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e 64 43  ell(pPage, findC
9f20: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
9f30: 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  ), pInfo);.}../*
9f40: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
9f50: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
9f60: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
9f70: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 43  f the MemPage.xC
9f80: 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f  ellSize.** metho
9f90: 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  d..**.** Compute
9fa0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
9fb0: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
9fc0: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
9fd0: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
9fe0: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
9ff0: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
a000: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
a010: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
a020: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
a030: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
a040: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
a050: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
a060: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
a070: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
a080: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65  ointer..**.** ce
a090: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
a0a0: 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74 61 62  ad()    =>   tab
a0b0: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  le internal node
a0c0: 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72  s.** cellSizePtr
a0d0: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ()             =
a0e0: 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f  >   all index no
a0f0: 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65 61 66  des & table leaf
a100: 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63   nodes.*/.static
a110: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
a120: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
a130: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
a140: 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  8 *pIter = pCell
a150: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
a160: 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c  trSize; /* For l
a170: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
a180: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
a190: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
a1c0: 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e  mark for a varin
a1d0: 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65  t */.  u32 nSize
a1e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a200: 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20 74 6f  /* Size value to
a210: 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64   return */..#ifd
a220: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a230: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
a240: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
a250: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
a260: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
a270: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
a280: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
a290: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
a2a0: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
a2b0: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
a2c0: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
a2d0: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
a2e0: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
a2f0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
a300: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
a310: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
a320: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
a330: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
a340: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
a350: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
a360: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
a370: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
a380: 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nfo);.#endif..  
a390: 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a  nSize = *pIter;.
a3a0: 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38    if( nSize>=0x8
a3b0: 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20  0 ){.    pEnd = 
a3c0: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
a3d0: 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a 20 20  Size &= 0x7f;.  
a3e0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a    do{.      nSiz
a3f0: 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c  e = (nSize<<7) |
a400: 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37   (*++pIter & 0x7
a410: 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  f);.    }while( 
a420: 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26  *(pIter)>=0x80 &
a430: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a440: 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20    }.  pIter++;. 
a450: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
a460: 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74  ey ){.    /* pIt
a470: 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74  er now points at
a480: 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65   the 64-bit inte
a490: 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61  ger key value, a
a4a0: 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
a4b0: 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72   .    ** integer
a4c0: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
a4d0: 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65  block moves pIte
a4e0: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
a4f0: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20  e first byte.   
a500: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
a510: 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75   of the key valu
a520: 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d  e. */.    pEnd =
a530: 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20   &pIter[9];.    
a540: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
a550: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
a560: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65  pEnd );.  }.  te
a570: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a580: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a590: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53  ;.  testcase( nS
a5a0: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
a5b0: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
a5c0: 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61  nSize<=pPage->ma
a5d0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53  xLocal ){.    nS
a5e0: 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74  ize += (u32)(pIt
a5f0: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
a600: 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e   if( nSize<4 ) n
a610: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73  Size = 4;.  }els
a620: 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  e{.    int minLo
a630: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
a640: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65  Local;.    nSize
a650: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
a660: 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  Size - minLocal)
a670: 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
a680: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
a690: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
a6a0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
a6b0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
a6c0: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a6d0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
a6e0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
a6f0: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
a700: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
a710: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
a720: 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34  }.    nSize += 4
a730: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
a740: 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61   pCell);.  }.  a
a750: 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65  ssert( nSize==de
a760: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c  buginfo.nSize ||
a770: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
a780: 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69   return (u16)nSi
a790: 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36  ze;.}.static u16
a7a0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
a7b0: 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20 2a 70  yload(MemPage *p
a7c0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a7d0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a7e0: 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f  pCell + 4; /* Fo
a7f0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62  r looping over b
a800: 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f  ytes of pCell */
a810: 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20  .  u8 *pEnd;    
a820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
a830: 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72 69   mark for a vari
a840: 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  nt */..#ifdef SQ
a850: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
a860: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
a870: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
a880: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
a890: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
a8a0: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
a8b0: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
a8c0: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
a8d0: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
a8e0: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
a8f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
a900: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
a910: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
a920: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
a930: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
a940: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
a950: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
a960: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
a970: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
a980: 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
a990: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
a9a0: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
a9b0: 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
a9c0: 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29  PARAMETER(pPage)
a9d0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
a9e0: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
a9f0: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
aa00: 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b 20 39  pEnd = pIter + 9
aa10: 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74  ;.  while( (*pIt
aa20: 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49  er++)&0x80 && pI
aa30: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73  ter<pEnd );.  as
aa40: 73 65 72 74 28 20 64 65 62 75 67 69 6e 66 6f 2e  sert( debuginfo.
aa50: 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70 49 74  nSize==(u16)(pIt
aa60: 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43  er - pCell) || C
aa70: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72  ORRUPT_DB );.  r
aa80: 65 74 75 72 6e 20 28 75 31 36 29 28 70 49 74 65  eturn (u16)(pIte
aa90: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a  r - pCell);.}...
aaa0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
aab0: 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72 69  BUG./* This vari
aac0: 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a  ation on cellSiz
aad0: 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20 69  ePtr() is used i
aae0: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
aaf0: 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  ) statements.** 
ab00: 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20  only. */.static 
ab10: 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d  u16 cellSize(Mem
ab20: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
ab30: 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72   iCell){.  retur
ab40: 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  n pPage->xCellSi
ab50: 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  ze(pPage, findCe
ab60: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
ab70: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
ab80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ab90: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
aba0: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
abb0: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
abc0: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
abd0: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
abe0: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
abf0: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
ac00: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
ac10: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
ac20: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
ac30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ac40: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
ac50: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
ac60: 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74  , u8 *pCell, int
ac70: 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e   *pRC){.  CellIn
ac80: 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a  fo info;.  if( *
ac90: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
aca0: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
acb0: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61   );.  pPage->xPa
acc0: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
acd0: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
ace0: 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c  if( info.nLocal<
acf0: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b  info.nPayload ){
ad00: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d  .    Pgno ovfl =
ad10: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
ad20: 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b  [info.nSize-4]);
ad30: 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
ad40: 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c  Page->pBt, ovfl,
ad50: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
ad60: 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  1, pPage->pgno, 
ad70: 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  pRC);.  }.}.#end
ad80: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61  if.../*.** Defra
ad90: 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67  gment the page g
ada0: 69 76 65 6e 2e 20 54 68 69 73 20 72 6f 75 74 69  iven. This routi
adb0: 6e 65 20 72 65 6f 72 67 61 6e 69 7a 65 73 20 63  ne reorganizes c
adc0: 65 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 0a  ells within the.
add0: 2a 2a 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  ** page so that 
ade0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65  there are no fre
adf0: 65 2d 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  e-blocks on the 
ae00: 66 72 65 65 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e  free-block list.
ae10: 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
ae20: 20 6e 4d 61 78 46 72 61 67 20 69 73 20 74 68 65   nMaxFrag is the
ae30: 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
ae40: 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 73 70  of fragmented sp
ae50: 61 63 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a  ace that may be.
ae60: 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  ** present in th
ae70: 65 20 70 61 67 65 20 61 66 74 65 72 20 74 68 69  e page after thi
ae80: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
ae90: 73 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43  s..**.** EVIDENC
aea0: 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30  E-OF: R-44582-60
aeb0: 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66  138 SQLite may f
aec0: 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65  rom time to time
aed0: 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a   reorganize a.**
aee0: 20 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20   b-tree page so 
aef0: 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
af00: 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20  o freeblocks or 
af10: 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20  fragment bytes, 
af20: 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79  all.** unused by
af30: 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  tes are containe
af40: 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63  d in the unalloc
af50: 61 74 65 64 20 73 70 61 63 65 20 72 65 67 69 6f  ated space regio
af60: 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65  n, and all.** ce
af70: 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20 74  lls are packed t
af80: 69 67 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e  ightly at the en
af90: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  d of the page..*
afa0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66  /.static int def
afb0: 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50  ragmentPage(MemP
afc0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
afd0: 6e 4d 61 78 46 72 61 67 29 7b 0a 20 20 69 6e 74  nMaxFrag){.  int
afe0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
aff0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
b000: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
b010: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
b020: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
b030: 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63  ss of the i-th c
b040: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ell */.  int hdr
b050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b060: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
b070: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
b080: 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20   */.  int size; 
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
b0b0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ll */.  int usab
b0c0: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
b0d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b0e0: 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20  usable bytes on 
b0f0: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
b100: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20  cellOffset;     
b110: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
b120: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   to the cell poi
b130: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
b140: 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20  int cbrk;       
b150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
b160: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
b170: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
b180: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b1a0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
b1b0: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
b1c0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b1d0: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
b1e0: 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  The page data */
b1f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b200: 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a   *temp;       /*
b210: 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63   Temp area for c
b220: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
b230: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b240: 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  src;        /* S
b250: 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74  ource of content
b260: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46   */.  int iCellF
b270: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
b280: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
b290: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
b2a0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
b2b0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
b2c0: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
b2d0: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20  cell index */.. 
b2e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b2f0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
b300: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
b310: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b320: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
b330: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b340: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
b350: 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  <= SQLITE_MAX_PA
b360: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73  GE_SIZE );.  ass
b370: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
b380: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
b390: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b3a0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b3b0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b3c0: 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63   temp = 0;.  src
b3d0: 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d   = data = pPage-
b3e0: 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
b3f0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b400: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
b410: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
b420: 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  et;.  nCell = pP
b430: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
b440: 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74  sert( nCell==get
b450: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b460: 33 5d 29 20 29 3b 0a 20 20 69 43 65 6c 6c 46 69  3]) );.  iCellFi
b470: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
b480: 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73   + 2*nCell;.  us
b490: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
b4a0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b4b0: 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c  e;..  /* This bl
b4c0: 6f 63 6b 20 68 61 6e 64 6c 65 73 20 70 61 67 65  ock handles page
b4d0: 73 20 77 69 74 68 20 74 77 6f 20 6f 72 20 66 65  s with two or fe
b4e0: 77 65 72 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  wer free blocks 
b4f0: 61 6e 64 20 6e 4d 61 78 46 72 61 67 0a 20 20 2a  and nMaxFrag.  *
b500: 2a 20 6f 72 20 66 65 77 65 72 20 66 72 61 67 6d  * or fewer fragm
b510: 65 6e 74 65 64 20 62 79 74 65 73 2e 20 49 6e 20  ented bytes. In 
b520: 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
b530: 66 61 73 74 65 72 20 74 6f 20 6d 6f 76 65 20 74  faster to move t
b540: 68 65 0a 20 20 2a 2a 20 74 77 6f 20 28 6f 72 20  he.  ** two (or 
b550: 6f 6e 65 29 20 62 6c 6f 63 6b 73 20 6f 66 20 63  one) blocks of c
b560: 65 6c 6c 73 20 75 73 69 6e 67 20 6d 65 6d 6d 6f  ells using memmo
b570: 76 65 28 29 20 61 6e 64 20 61 64 64 20 74 68 65  ve() and add the
b580: 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 6f   required.  ** o
b590: 66 66 73 65 74 73 20 74 6f 20 65 61 63 68 20 70  ffsets to each p
b5a0: 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 65  ointer in the ce
b5b0: 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
b5c0: 20 74 68 61 6e 20 69 74 20 69 73 20 74 6f 20 0a   than it is to .
b5d0: 20 20 2a 2a 20 72 65 63 6f 6e 73 74 72 75 63 74    ** reconstruct
b5e0: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65   the entire page
b5f0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 69 6e 74  .  */.  if( (int
b600: 29 64 61 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d  )data[hdr+7]<=nM
b610: 61 78 46 72 61 67 20 29 7b 0a 20 20 20 20 69 6e  axFrag ){.    in
b620: 74 20 69 46 72 65 65 20 3d 20 67 65 74 32 62 79  t iFree = get2by
b630: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
b640: 3b 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 20  ;.    if( iFree 
b650: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46 72  ){.      int iFr
b660: 65 65 32 20 3d 20 67 65 74 32 62 79 74 65 28 26  ee2 = get2byte(&
b670: 64 61 74 61 5b 69 46 72 65 65 5d 29 3b 0a 0a 20  data[iFree]);.. 
b680: 20 20 20 20 20 2f 2a 20 70 61 67 65 46 69 6e 64       /* pageFind
b690: 53 6c 6f 74 28 29 20 68 61 73 20 61 6c 72 65 61  Slot() has alrea
b6a0: 64 79 20 76 65 72 69 66 69 65 64 20 74 68 61 74  dy verified that
b6b0: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 72 65   free blocks are
b6c0: 20 73 6f 72 74 65 64 0a 20 20 20 20 20 20 2a 2a   sorted.      **
b6d0: 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 6f 66 66   in order of off
b6e0: 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 70  set within the p
b6f0: 61 67 65 2c 20 61 6e 64 20 74 68 61 74 20 6e 6f  age, and that no
b700: 20 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 0a 20   block extends. 
b710: 20 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65       ** past the
b720: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
b730: 2e 20 50 72 6f 76 69 64 65 64 20 74 68 65 20 74  . Provided the t
b740: 77 6f 20 66 72 65 65 20 73 6c 6f 74 73 20 64 6f  wo free slots do
b750: 20 6e 6f 74 20 0a 20 20 20 20 20 20 2a 2a 20 6f   not .      ** o
b760: 76 65 72 6c 61 70 2c 20 74 68 69 73 20 67 75 61  verlap, this gua
b770: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
b780: 20 6d 65 6d 6d 6f 76 65 28 29 20 63 61 6c 6c 73   memmove() calls
b790: 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a   below will not.
b7a0: 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69        ** overwri
b7b0: 74 65 20 74 68 65 20 75 73 61 62 6c 65 53 69 7a  te the usableSiz
b7c0: 65 20 62 79 74 65 20 62 75 66 66 65 72 2c 20 65  e byte buffer, e
b7d0: 76 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62  ven if the datab
b7e0: 61 73 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ase page.      *
b7f0: 2a 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20 2a  * is corrupt.  *
b800: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
b810: 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20 69 46 72  iFree2==0 || iFr
b820: 65 65 32 3e 69 46 72 65 65 20 29 3b 0a 20 20 20  ee2>iFree );.   
b830: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
b840: 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  +get2byte(&data[
b850: 69 46 72 65 65 2b 32 5d 29 20 3c 3d 20 75 73 61  iFree+2]) <= usa
b860: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
b870: 20 61 73 73 65 72 74 28 20 69 46 72 65 65 32 3d   assert( iFree2=
b880: 3d 30 20 7c 7c 20 69 46 72 65 65 32 2b 67 65 74  =0 || iFree2+get
b890: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
b8a0: 65 32 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65  e2+2]) <= usable
b8b0: 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 20 20 69  Size );..      i
b8c0: 66 28 20 30 3d 3d 69 46 72 65 65 32 20 7c 7c 20  f( 0==iFree2 || 
b8d0: 28 64 61 74 61 5b 69 46 72 65 65 32 5d 3d 3d 30  (data[iFree2]==0
b8e0: 20 26 26 20 64 61 74 61 5b 69 46 72 65 65 32 2b   && data[iFree2+
b8f0: 31 5d 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  1]==0) ){.      
b900: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 64 61    u8 *pEnd = &da
b910: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
b920: 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20 20 20  nCell*2];.      
b930: 20 20 75 38 20 2a 70 41 64 64 72 3b 0a 20 20 20    u8 *pAddr;.   
b940: 20 20 20 20 20 69 6e 74 20 73 7a 32 20 3d 20 30       int sz2 = 0
b950: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  ;.        int sz
b960: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b970: 61 5b 69 46 72 65 65 2b 32 5d 29 3b 0a 20 20 20  a[iFree+2]);.   
b980: 20 20 20 20 20 69 6e 74 20 74 6f 70 20 3d 20 67       int top = g
b990: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
b9a0: 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  r+5]);.        i
b9b0: 66 28 20 69 46 72 65 65 32 20 29 7b 0a 20 20 20  f( iFree2 ){.   
b9c0: 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65         if( iFree
b9d0: 2b 73 7a 3e 69 46 72 65 65 32 20 29 20 72 65 74  +sz>iFree2 ) ret
b9e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
b9f0: 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
ba00: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
ba10: 73 7a 32 20 3d 20 67 65 74 32 62 79 74 65 28 26  sz2 = get2byte(&
ba20: 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b  data[iFree2+2]);
ba30: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
ba40: 74 28 20 69 46 72 65 65 2b 73 7a 2b 73 7a 32 2b  t( iFree+sz+sz2+
ba50: 69 46 72 65 65 32 2d 28 69 46 72 65 65 2b 73 7a  iFree2-(iFree+sz
ba60: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
ba70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
ba80: 6d 6f 76 65 28 26 64 61 74 61 5b 69 46 72 65 65  move(&data[iFree
ba90: 2b 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b  +sz+sz2], &data[
baa0: 69 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65  iFree+sz], iFree
bab0: 32 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20  2-(iFree+sz));. 
bac0: 20 20 20 20 20 20 20 20 20 73 7a 20 2b 3d 20 73           sz += s
bad0: 7a 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  z2;.        }.  
bae0: 20 20 20 20 20 20 63 62 72 6b 20 3d 20 74 6f 70        cbrk = top
baf0: 2b 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73  +sz;.        ass
bb00: 65 72 74 28 20 63 62 72 6b 2b 28 69 46 72 65 65  ert( cbrk+(iFree
bb10: 2d 74 6f 70 29 20 3c 3d 20 75 73 61 62 6c 65 53  -top) <= usableS
bb20: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d  ize );.        m
bb30: 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 63 62 72  emmove(&data[cbr
bb40: 6b 5d 2c 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20  k], &data[top], 
bb50: 69 46 72 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20  iFree-top);.    
bb60: 20 20 20 20 66 6f 72 28 70 41 64 64 72 3d 26 64      for(pAddr=&d
bb70: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b  ata[cellOffset];
bb80: 20 70 41 64 64 72 3c 70 45 6e 64 3b 20 70 41 64   pAddr<pEnd; pAd
bb90: 64 72 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20  dr+=2){.        
bba0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
bbb0: 70 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20  pAddr);.        
bbc0: 20 20 69 66 28 20 70 63 3c 69 46 72 65 65 20 29    if( pc<iFree )
bbd0: 7b 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72  { put2byte(pAddr
bbe0: 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20  , pc+sz); }.    
bbf0: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70        else if( p
bc00: 63 3c 69 46 72 65 65 32 20 29 7b 20 70 75 74 32  c<iFree2 ){ put2
bc10: 62 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73  byte(pAddr, pc+s
bc20: 7a 32 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  z2); }.        }
bc30: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
bc40: 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20  fragment_out;.  
bc50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
bc60: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
bc70: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Size;.  iCellLas
bc80: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
bc90: 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   4;.  for(i=0; i
bca0: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
bcb0: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
bcc0: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
bcd0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
bce0: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
bcf0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
bd00: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
bd10: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
bd20: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
bd30: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
bd40: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
bd50: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f  ellLast );.    /
bd60: 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f  * These conditio
bd70: 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ns have already 
bd80: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e  been verified in
bd90: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
bda0: 0a 20 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d  .    ** if PRAGM
bdb0: 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63  A cell_size_chec
bdc0: 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  k=ON..    */.   
bdd0: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
bde0: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
bdf0: 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
be00: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
be10: 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67  T_PGNO(pPage->pg
be20: 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  no);.    }.    a
be30: 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c  ssert( pc>=iCell
be40: 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65  First && pc<=iCe
be50: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69  llLast );.    si
be60: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c  ze = pPage->xCel
be70: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73 72  lSize(pPage, &sr
be80: 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  c[pc]);.    cbrk
be90: 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66   -= size;.    if
bea0: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
beb0: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
bec0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
bed0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
bee0: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
bef0: 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  e->pgno);.    }.
bf00: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
bf10: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
bf20: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
bf30: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
bf40: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
bf50: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
bf60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
bf70: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
bf80: 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  e );.    put2byt
bf90: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
bfa0: 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20      if( temp==0 
bfb0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  ){.      int x;.
bfc0: 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d        if( cbrk==
bfd0: 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pc ) continue;. 
bfe0: 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69       temp = sqli
bff0: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
c000: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
c010: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d  ager);.      x =
c020: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c030: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d  hdr+5]);.      m
c040: 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20  emcpy(&temp[x], 
c050: 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b  &data[x], (cbrk+
c060: 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20  size) - x);.    
c070: 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20    src = temp;.  
c080: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26    }.    memcpy(&
c090: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63  data[cbrk], &src
c0a0: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d  [pc], size);.  }
c0b0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
c0c0: 20 30 3b 0a 0a 20 64 65 66 72 61 67 6d 65 6e 74   0;.. defragment
c0d0: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 61 74 61  _out:.  if( data
c0e0: 5b 68 64 72 2b 37 5d 2b 63 62 72 6b 2d 69 43 65  [hdr+7]+cbrk-iCe
c0f0: 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e  llFirst!=pPage->
c100: 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74  nFree ){.    ret
c110: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c120: 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
c130: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  gno);.  }.  asse
c140: 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46  rt( cbrk>=iCellF
c150: 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79  irst );.  put2by
c160: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
c170: 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68   cbrk);.  data[h
c180: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
c190: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
c1a0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65  memset(&data[iCe
c1b0: 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72  llFirst], 0, cbr
c1c0: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  k-iCellFirst);. 
c1d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c1e0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
c1f0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c200: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
c210: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c220: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
c230: 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50  -list on page pP
c240: 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73  g for space to s
c250: 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74  tore a cell nByt
c260: 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69  e bytes in.** si
c270: 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62  ze. If one can b
c280: 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
c290: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
c2a0: 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76   space and remov
c2b0: 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  e it.** from the
c2c0: 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
c2d0: 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
c2e0: 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f   space can be fo
c2f0: 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  und on the free-
c300: 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c  list, return NUL
c310: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  L..**.** This fu
c320: 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63  nction may detec
c330: 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74  t corruption wit
c340: 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72  hin pPg.  If cor
c350: 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65  ruption is.** de
c360: 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63  tected then *pRc
c370: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
c380: 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55  E_CORRUPT and NU
c390: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
c3a0: 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74  **.** Slots on t
c3b0: 68 65 20 66 72 65 65 20 6c 69 73 74 20 74 68 61  he free list tha
c3c0: 74 20 61 72 65 20 62 65 74 77 65 65 6e 20 31 20  t are between 1 
c3d0: 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72 67  and 3 bytes larg
c3e0: 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a  er than nByte.**
c3f0: 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
c400: 20 69 66 20 61 64 64 69 6e 67 20 74 68 65 20 65   if adding the e
c410: 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 74 68  xtra space to th
c420: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
c430: 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20  count.** causes 
c440: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
c450: 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65  n count to excee
c460: 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  d 60..*/.static 
c470: 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74  u8 *pageFindSlot
c480: 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69  (MemPage *pPg, i
c490: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
c4a0: 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  Rc){.  const int
c4b0: 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
c4c0: 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f  ffset;.  u8 * co
c4d0: 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
c4e0: 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41  >aData;.  int iA
c4f0: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
c500: 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79   int pc = get2by
c510: 74 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  te(&aData[iAddr]
c520: 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e  );.  int x;.  in
c530: 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  t usableSize = p
c540: 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  Pg->pBt->usableS
c550: 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
c560: 70 63 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  pc>0 );.  do{.  
c570: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
c580: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
c590: 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20  f the free slot 
c5a0: 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  */.    /* EVIDEN
c5b0: 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33  CE-OF: R-06866-3
c5c0: 39 31 32 35 20 46 72 65 65 62 6c 6f 63 6b 73 20  9125 Freeblocks 
c5d0: 61 72 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65  are always conne
c5e0: 63 74 65 64 20 69 6e 20 6f 72 64 65 72 20 6f 66  cted in order of
c5f0: 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65 61 73 69  .    ** increasi
c600: 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20  ng offset. */.  
c610: 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53    if( pc>usableS
c620: 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64  ize-4 || pc<iAdd
c630: 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  r+4 ){.      *pR
c640: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
c650: 50 54 5f 50 47 4e 4f 28 70 50 67 2d 3e 70 67 6e  PT_PGNO(pPg->pgn
c660: 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
c670: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a   0;.    }.    /*
c680: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
c690: 32 32 37 31 30 2d 35 33 33 32 38 20 54 68 65 20  22710-53328 The 
c6a0: 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68  third and fourth
c6b0: 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20   bytes of each. 
c6c0: 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20     ** freeblock 
c6d0: 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61  form a big-endia
c6e0: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
c6f0: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
c700: 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20  he freeblock.   
c710: 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e   ** in bytes, in
c720: 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79  cluding the 4-by
c730: 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  te header. */.  
c740: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
c750: 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b  e(&aData[pc+2]);
c760: 0a 20 20 20 20 69 66 28 20 28 78 20 3d 20 73 69  .    if( (x = si
c770: 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29  ze - nByte)>=0 )
c780: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
c790: 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ( x==4 );.      
c7a0: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29  testcase( x==3 )
c7b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 20 3c  ;.      if( pc <
c7c0: 20 70 50 67 2d 3e 63 65 6c 6c 4f 66 66 73 65 74   pPg->cellOffset
c7d0: 2b 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c  +2*pPg->nCell ||
c7e0: 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c   size+pc > usabl
c7f0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
c800: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43   *pRc = SQLITE_C
c810: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 67 2d  ORRUPT_PGNO(pPg-
c820: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
c830: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
c840: 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b  }else if( x<4 ){
c850: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
c860: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38  ENCE-OF: R-11498
c870: 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c  -58022 In a well
c880: 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70  -formed b-tree p
c890: 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20  age, the total. 
c8a0: 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
c8b0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61   of bytes in fra
c8c0: 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65  gments may not e
c8d0: 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20  xceed 60. */.   
c8e0: 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68       if( aData[h
c8f0: 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72  dr+7]>57 ) retur
c900: 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  n 0;..        /*
c910: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74   Remove the slot
c920: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
c930: 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20  ist. Update the 
c940: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
c950: 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20    ** fragmented 
c960: 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65  bytes within the
c970: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
c980: 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
c990: 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70  iAddr], &aData[p
c9a0: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
c9b0: 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20  aData[hdr+7] += 
c9c0: 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c  (u8)x;.      }el
c9d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
c9e0: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
c9f0: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
ca00: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
ca10: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
ca20: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
ca30: 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79   portion used by
ca40: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
ca50: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
ca60: 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
ca70: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
ca80: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
ca90: 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a  &aData[pc + x];.
caa0: 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20      }.    iAddr 
cab0: 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67  = pc;.    pc = g
cac0: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
cad0: 63 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70  c]);.  }while( p
cae0: 63 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30  c );..  return 0
caf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
cb00: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
cb10: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
cb20: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
cb30: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
cb40: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
cb50: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
cb60: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
cb70: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
cb80: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
cb90: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
cba0: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
cbb0: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
cbc0: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
cbd0: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
cbe0: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
cbf0: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
cc00: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
cc10: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
cc20: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
cc30: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
cc40: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
cc50: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
cc60: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
cc70: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
cc80: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
cc90: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
cca0: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
ccb0: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
ccc0: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
ccd0: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
cce0: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
ccf0: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
cd00: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
cd10: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
cd20: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
cd30: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
cd40: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
cd50: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
cd60: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
cd70: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
cd80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
cd90: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
cda0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
cdb0: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
cdc0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
cdd0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
cde0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
cdf0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
ce00: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
ce10: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
ce20: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
ce30: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
ce40: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
ce50: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Data */.  int to
ce60: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ce80: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
ce90: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
cea0: 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  a */.  int rc = 
ceb0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
ced0: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
cee0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b  de */.  int gap;
cef0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
cf00: 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74   byte of gap bet
cf10: 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65  ween cell pointe
cf20: 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74  rs and cell cont
cf30: 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  ent */.  .  asse
cf40: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
cf50: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
cf60: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
cf70: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
cf80: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
cf90: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
cfa0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
cfb0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
cfc0: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
cfd0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
cfe0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
cff0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
d000: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
d010: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d020: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
d030: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20    assert( nByte 
d040: 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70  < (int)(pPage->p
d050: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38  Bt->usableSize-8
d060: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
d070: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
d080: 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  t == hdr + 12 - 
d090: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
d0a0: 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e  .  gap = pPage->
d0b0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
d0c0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
d0d0: 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33  ssert( gap<=6553
d0e0: 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  6 );.  /* EVIDEN
d0f0: 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30  CE-OF: R-29356-0
d100: 32 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61  2391 If the data
d110: 62 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33  base uses a 6553
d120: 36 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65  6-byte page size
d130: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
d140: 73 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20  served space is 
d150: 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20  zero (the usual 
d160: 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76  value for reserv
d170: 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74  ed space).  ** t
d180: 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  hen the cell con
d190: 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61  tent offset of a
d1a0: 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e  n empty page wan
d1b0: 74 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a  ts to be 65536..
d1c0: 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68    ** However, th
d1d0: 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f  at integer is to
d1e0: 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74  o large to be st
d1f0: 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65  ored in a 2-byte
d200: 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69   unsigned.  ** i
d210: 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c  nteger, so a val
d220: 75 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20  ue of 0 is used 
d230: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f  in its place. */
d240: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
d250: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
d260: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d  .  assert( top<=
d270: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
d280: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f  >usableSize ); /
d290: 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74  * Prevent by get
d2a0: 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f  AndInitPage() */
d2b0: 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29  .  if( gap>top )
d2c0: 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30  {.    if( top==0
d2d0: 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   && pPage->pBt->
d2e0: 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33  usableSize==6553
d2f0: 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d  6 ){.      top =
d300: 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73   65536;.    }els
d310: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
d320: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
d330: 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
d340: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
d350: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 65 6e  * If there is en
d360: 6f 75 67 68 20 73 70 61 63 65 20 62 65 74 77 65  ough space betwe
d370: 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66  en gap and top f
d380: 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c  or one more cell
d390: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72   pointer.  ** ar
d3a0: 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74  ray entry offset
d3b0: 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66 72 65  , and if the fre
d3c0: 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70  elist is not emp
d3d0: 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20  ty, then search 
d3e0: 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73  the.  ** freelis
d3f0: 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  t looking for a 
d400: 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e  free slot big en
d410: 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20  ough to satisfy 
d420: 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a  the request..  *
d430: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  /.  testcase( ga
d440: 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65  p+2==top );.  te
d450: 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74  stcase( gap+1==t
d460: 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  op );.  testcase
d470: 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20  ( gap==top );.  
d480: 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d  if( (data[hdr+2]
d490: 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29   || data[hdr+1])
d4a0: 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29   && gap+2<=top )
d4b0: 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63 65  {.    u8 *pSpace
d4c0: 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28   = pageFindSlot(
d4d0: 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72  pPage, nByte, &r
d4e0: 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61  c);.    if( pSpa
d4f0: 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ce ){.      asse
d500: 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61  rt( pSpace>=data
d510: 20 26 26 20 28 70 53 70 61 63 65 20 2d 20 64 61   && (pSpace - da
d520: 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20  ta)<65536 );.   
d530: 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29     *pIdx = (int)
d540: 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b  (pSpace - data);
d550: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
d560: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
d570: 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  se if( rc ){.   
d580: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d590: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
d5a0: 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20  e request could 
d5b0: 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64  not be fulfilled
d5c0: 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73   using a freelis
d5d0: 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20  t slot.  Check. 
d5e0: 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65   ** to see if de
d5f0: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73  fragmentation is
d600: 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
d610: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
d620: 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b  +2+nByte==top );
d630: 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79  .  if( gap+2+nBy
d640: 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73  te>top ){.    as
d650: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
d660: 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ll>0 || CORRUPT_
d670: 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  DB );.    rc = d
d680: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
d690: 61 67 65 2c 20 4d 49 4e 28 34 2c 20 70 50 61 67  age, MIN(4, pPag
d6a0: 65 2d 3e 6e 46 72 65 65 20 2d 20 28 32 2b 6e 42  e->nFree - (2+nB
d6b0: 79 74 65 29 29 29 3b 0a 20 20 20 20 69 66 28 20  yte)));.    if( 
d6c0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
d6d0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
d6e0: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
d6f0: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73  hdr+5]);.    ass
d700: 65 72 74 28 20 67 61 70 2b 32 2b 6e 42 79 74 65  ert( gap+2+nByte
d710: 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20  <=top );.  }... 
d720: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
d730: 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70  ory from the gap
d740: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
d750: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
d760: 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ay.  ** and the 
d770: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
d780: 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69  a.  The btreeIni
d790: 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73  tPage() call has
d7a0: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61   already.  ** va
d7b0: 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65  lidated the free
d7c0: 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61  list.  Given tha
d7d0: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  t the freelist i
d7e0: 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20  s valid, there. 
d7f0: 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68   ** is no way th
d800: 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  at the allocatio
d810: 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66  n can extend off
d820: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
d830: 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61  page..  ** The a
d840: 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65  ssert() below ve
d850: 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69  rifies the previ
d860: 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20  ous sentence..  
d870: 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74  */.  top -= nByt
d880: 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  e;.  put2byte(&d
d890: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
d8a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b  ;.  assert( top+
d8b0: 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50  nByte <= (int)pP
d8c0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
d8d0: 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20  Size );.  *pIdx 
d8e0: 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = top;.  return 
d8f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d900: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
d910: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
d920: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
d930: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
d940: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
d950: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
d960: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74  k is pPage->aDat
d970: 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64  a[iStart].** and
d980: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
d990: 20 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20   block is iSize 
d9a0: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a  bytes..**.** Adj
d9b0: 61 63 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73  acent freeblocks
d9c0: 20 61 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a   are coalesced..
d9d0: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
d9e0: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20  even though the 
d9f0: 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77  freeblock list w
da00: 61 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74  as checked by bt
da10: 72 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a  reeInitPage(),.*
da20: 2a 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77  * that routine w
da30: 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f  ill not detect o
da40: 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63  verlap between c
da50: 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63  ells or freebloc
da60: 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73  ks.  Nor.** does
da70: 20 69 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73   it detect cells
da80: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74   or freeblocks t
da90: 68 61 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74  hat encrouch int
daa0: 6f 20 74 68 65 20 72 65 73 65 72 76 65 64 20 62  o the reserved b
dab0: 79 74 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65  ytes.** at the e
dac0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nd of the page. 
dad0: 20 53 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61   So do additiona
dae0: 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65  l corruption che
daf0: 63 6b 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a  cks inside this.
db00: 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72  ** routine and r
db10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
db20: 52 55 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62  RUPT if any prob
db30: 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a  lems are found..
db40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
db50: 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  eeSpace(MemPage 
db60: 2a 70 50 61 67 65 2c 20 75 31 36 20 69 53 74 61  *pPage, u16 iSta
db70: 72 74 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a  rt, u16 iSize){.
db80: 20 20 75 31 36 20 69 50 74 72 3b 20 20 20 20 20    u16 iPtr;     
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dba0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
dbb0: 73 73 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78  ss of ptr to nex
dbc0: 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20  t freeblock */. 
dbd0: 20 75 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20   u16 iFreeBlk;  
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbf0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
dc00: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72  s of the next fr
dc10: 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20  eeblock */.  u8 
dc20: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc40: 20 20 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65     /* Page heade
dc50: 72 20 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30  r size.  0 or 10
dc60: 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20  0 */.  u8 nFrag 
dc70: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dc90: 52 65 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61  Reduction in fra
dca0: 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  gmentation */.  
dcb0: 75 31 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20  u16 iOrigSize = 
dcc0: 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
dcd0: 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
dce0: 6c 20 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65  l value of iSize
dcf0: 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61 73 74 20   */.  u32 iLast 
dd00: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
dd10: 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c  ableSize-4; /* L
dd20: 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20  argest possible 
dd30: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
dd40: 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d   */.  u32 iEnd =
dd50: 20 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b   iStart + iSize;
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
dd70: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
dd80: 68 65 20 69 53 74 61 72 74 20 62 75 66 66 65 72  he iStart buffer
dd90: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
dda0: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
ddb0: 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50  e->aData;   /* P
ddc0: 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  age content */..
ddd0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
dde0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
ddf0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
de00: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
de10: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
de20: 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
de30: 54 5f 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d  T_DB || iStart>=
de40: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
de50: 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  +6+pPage->childP
de60: 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  trSize );.  asse
de70: 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
de80: 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d  | iEnd <= pPage-
de90: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
dea0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
deb0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
dec0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
ded0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
dee0: 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f   iSize>=4 );   /
def0: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
df00: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73  ize is 4 */.  as
df10: 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c  sert( iStart<=iL
df20: 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65  ast );..  /* Ove
df30: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
df40: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
df50: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73  zeros when the s
df60: 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a  ecure_delete.  *
df70: 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  * option is enab
df80: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  led */.  if( pPa
df90: 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67  ge->pBt->btsFlag
dfa0: 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43  s & BTS_FAST_SEC
dfb0: 55 52 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  URE ){.    memse
dfc0: 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  t(&data[iStart],
dfd0: 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a   0, iSize);.  }.
dfe0: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
dff0: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
e000: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
e010: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
e020: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
e030: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
e040: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
e050: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
e060: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
e070: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
e080: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
e090: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
e0a0: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
e0b0: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
e0c0: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
e0d0: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
e0e0: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
e0f0: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
e100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
e110: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
e120: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
e130: 50 74 72 5d 29 29 3c 69 53 74 61 72 74 20 29 7b  Ptr]))<iStart ){
e140: 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65  .      if( iFree
e150: 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20 20  Blk<iPtr+4 ){.  
e160: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42        if( iFreeB
e170: 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  lk==0 ) break;. 
e180: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
e190: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
e1a0: 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
e1b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 50        }.      iP
e1c0: 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20  tr = iFreeBlk;. 
e1d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72     }.    if( iFr
e1e0: 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65  eeBlk>iLast ) re
e1f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e200: 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e  UPT_PGNO(pPage->
e210: 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
e220: 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50 74 72  t( iFreeBlk>iPtr
e230: 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20   || iFreeBlk==0 
e240: 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41 74 20  );.  .    /* At 
e250: 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20  this point:.    
e260: 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b 3a 20  **    iFreeBlk: 
e270: 20 20 46 69 72 73 74 20 66 72 65 65 62 6c 6f 63    First freebloc
e280: 6b 20 61 66 74 65 72 20 69 53 74 61 72 74 2c 20  k after iStart, 
e290: 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a  or zero if none.
e2a0: 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72 3a 20      **    iPtr: 
e2b0: 20 20 20 20 20 20 54 68 65 20 61 64 64 72 65 73        The addres
e2c0: 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 74  s of a pointer t
e2d0: 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a  o iFreeBlk.    *
e2e0: 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  *.    ** Check t
e2f0: 6f 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c  o see if iFreeBl
e300: 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c  k should be coal
e310: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
e320: 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20  nd of iStart..  
e330: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72    */.    if( iFr
e340: 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e  eeBlk && iEnd+3>
e350: 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20  =iFreeBlk ){.   
e360: 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65     nFrag = iFree
e370: 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20  Blk - iEnd;.    
e380: 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65    if( iEnd>iFree
e390: 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c  Blk ) return SQL
e3a0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
e3b0: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
e3c0: 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65       iEnd = iFre
e3d0: 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28  eBlk + get2byte(
e3e0: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32  &data[iFreeBlk+2
e3f0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  ]);.      if( iE
e400: 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  nd > pPage->pBt-
e410: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
e420: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
e430: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
e440: 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
e450: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53        }.      iS
e460: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74  ize = iEnd - iSt
e470: 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65  art;.      iFree
e480: 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
e490: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b  data[iFreeBlk]);
e4a0: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
e4b0: 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74   If iPtr is anot
e4c0: 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74  her freeblock (t
e4d0: 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20  hat is, if iPtr 
e4e0: 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c  is not the freel
e4f0: 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ist.    ** point
e500: 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68  er in the page h
e510: 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63  eader) then chec
e520: 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61  k to see if iSta
e530: 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20  rt should be.   
e540: 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   ** coalesced on
e550: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50  to the end of iP
e560: 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  tr..    */.    i
e570: 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b  f( iPtr>hdr+1 ){
e580: 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45  .      int iPtrE
e590: 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32  nd = iPtr + get2
e5a0: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b  byte(&data[iPtr+
e5b0: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
e5c0: 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74  PtrEnd+3>=iStart
e5d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e5e0: 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29  iPtrEnd>iStart )
e5f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e600: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
e610: 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  e->pgno);.      
e620: 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72    nFrag += iStar
e630: 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20  t - iPtrEnd;.   
e640: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
e650: 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20  d - iPtr;.      
e660: 20 20 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b    iStart = iPtr;
e670: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e680: 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74     if( nFrag>dat
e690: 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72  a[hdr+7] ) retur
e6a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e6b0: 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e  _PGNO(pPage->pgn
e6c0: 6f 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72  o);.    data[hdr
e6d0: 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20  +7] -= nFrag;.  
e6e0: 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74 3d 3d  }.  if( iStart==
e6f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
e700: 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a  dr+5]) ){.    /*
e710: 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f   The new freeblo
e720: 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65 67  ck is at the beg
e730: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65  inning of the ce
e740: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c  ll content area,
e750: 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20  .    ** so just 
e760: 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20  extend the cell 
e770: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74  content area rat
e780: 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65 20  her than create 
e790: 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66  another.    ** f
e7a0: 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f  reelist entry */
e7b0: 0a 20 20 20 20 69 66 28 20 69 50 74 72 21 3d 68  .    if( iPtr!=h
e7c0: 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53 51  dr+1 ) return SQ
e7d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
e7e0: 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  O(pPage->pgno);.
e7f0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
e800: 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65  ta[hdr+1], iFree
e810: 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79  Blk);.    put2by
e820: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
e830: 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b   iEnd);.  }else{
e840: 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
e850: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
e860: 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69   into the freeli
e870: 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79  st */.    put2by
e880: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20  te(&data[iPtr], 
e890: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74  iStart);.    put
e8a0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
e8b0: 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  rt], iFreeBlk);.
e8c0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
e8d0: 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53  ta[iStart+2], iS
e8e0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ize);.  }.  pPag
e8f0: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69  e->nFree += iOri
e900: 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  gSize;.  return 
e910: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e920: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
e930: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
e940: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
e950: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
e960: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
e970: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
e980: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
e990: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
e9a0: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
e9b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
e9c0: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
e9d0: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
e9e0: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
e9f0: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
ea00: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
ea10: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
ea20: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
ea30: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
ea40: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
ea50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
ea60: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
ea70: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
ea80: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
ea90: 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
eaa0: 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
eab0: 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
eac0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
ead0: 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
eae0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
eaf0: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
eb00: 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
eb10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
eb20: 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
eb30: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
eb40: 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
eb50: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
eb60: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
eb70: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
eb80: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38  Page->leaf = (u8
eb90: 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20  )(flagByte>>3); 
eba0: 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41   assert( PTF_LEA
ebb0: 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66  F == 1<<3 );.  f
ebc0: 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f  lagByte &= ~PTF_
ebd0: 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63  LEAF;.  pPage->c
ebe0: 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d  hildPtrSize = 4-
ebf0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
ec00: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
ec10: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b  e = cellSizePtr;
ec20: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
ec30: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
ec40: 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
ec50: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
ec60: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
ec70: 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32 39 31 2d  NCE-OF: R-07291-
ec80: 33 35 33 32 38 20 41 20 76 61 6c 75 65 20 6f 66  35328 A value of
ec90: 20 35 20 28 30 78 30 35 29 20 6d 65 61 6e 73 20   5 (0x05) means 
eca0: 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20  the page is an. 
ecb0: 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 74     ** interior t
ecc0: 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65  able b-tree page
ecd0: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
ece0: 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50   (PTF_LEAFDATA|P
ecf0: 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b  TF_INTKEY)==5 );
ed00: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
ed10: 2d 4f 46 3a 20 52 2d 32 36 39 30 30 2d 30 39 31  -OF: R-26900-091
ed20: 37 36 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33  76 A value of 13
ed30: 20 28 30 78 30 64 29 20 6d 65 61 6e 73 20 74 68   (0x0d) means th
ed40: 65 20 70 61 67 65 20 69 73 20 61 0a 20 20 20 20  e page is a.    
ed50: 2a 2a 20 6c 65 61 66 20 74 61 62 6c 65 20 62 2d  ** leaf table b-
ed60: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
ed70: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
ed80: 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
ed90: 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33  EY|PTF_LEAF)==13
eda0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
edb0: 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 69  ntKey = 1;.    i
edc0: 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
edd0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  {.      pPage->i
ede0: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20  ntKeyLeaf = 1;. 
edf0: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
ee00: 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
ee10: 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20  rseCellPtr;.    
ee20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
ee30: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
ee40: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   0;.      pPage-
ee50: 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c  >xCellSize = cel
ee60: 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61  lSizePtrNoPayloa
ee70: 64 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  d;.      pPage->
ee80: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
ee90: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f  eeParseCellPtrNo
eea0: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a 20  Payload;.    }. 
eeb0: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
eec0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61  al = pBt->maxLea
eed0: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  f;.    pPage->mi
eee0: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
eef0: 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69  nLeaf;.  }else i
ef00: 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46  f( flagByte==PTF
ef10: 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20  _ZERODATA ){.   
ef20: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
ef30: 20 52 2d 34 33 33 31 36 2d 33 37 33 30 38 20 41   R-43316-37308 A
ef40: 20 76 61 6c 75 65 20 6f 66 20 32 20 28 30 78 30   value of 2 (0x0
ef50: 32 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  2) means the pag
ef60: 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69  e is an.    ** i
ef70: 6e 74 65 72 69 6f 72 20 69 6e 64 65 78 20 62 2d  nterior index b-
ef80: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
ef90: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a    assert( (PTF_Z
efa0: 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20  ERODATA)==2 );. 
efb0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
efc0: 46 3a 20 52 2d 35 39 36 31 35 2d 34 32 38 32 38  F: R-59615-42828
efd0: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20 28   A value of 10 (
efe0: 30 78 30 61 29 20 6d 65 61 6e 73 20 74 68 65 20  0x0a) means the 
eff0: 70 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a  page is a.    **
f000: 20 6c 65 61 66 20 69 6e 64 65 78 20 62 2d 74 72   leaf index b-tr
f010: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
f020: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
f030: 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d  ODATA|PTF_LEAF)=
f040: 3d 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  =10 );.    pPage
f050: 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20  ->intKey = 0;.  
f060: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
f070: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  eaf = 0;.    pPa
f080: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
f090: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
f0a0: 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61  trIndex;.    pPa
f0b0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
f0c0: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
f0d0: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
f0e0: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
f0f0: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
f100: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
f110: 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e  R-47608-56469 An
f120: 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f  y other value fo
f130: 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  r the b-tree pag
f140: 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a  e type is.    **
f150: 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20   an error. */.  
f160: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f170: 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
f180: 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ge->pgno);.  }. 
f190: 20 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65   pPage->max1byte
f1a0: 50 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d  Payload = pBt->m
f1b0: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a  ax1bytePayload;.
f1c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f1d0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
f1e0: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
f1f0: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
f200: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
f210: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
f220: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
f230: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
f240: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
f250: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
f260: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
f270: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
f280: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
f290: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
f2a0: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
f2b0: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
f2c0: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
f2d0: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
f2e0: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
f2f0: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
f300: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
f310: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
f320: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
f330: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
f340: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
f350: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
f360: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
f370: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
f380: 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
f390: 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
f3a0: 5b 5d 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20  [] */.  u8 hdr; 
f3b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
f3c0: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
f3d0: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
f3e0: 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
f3f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
f400: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
f410: 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  a */.  BtShared 
f420: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
f430: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
f440: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
f450: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
f460: 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73   /* Amount of us
f470: 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61  able space on ea
f480: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36  ch page */.  u16
f490: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
f4a0: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
f4b0: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
f4c0: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
f4d0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  er */.  int nFre
f4e0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
f4f0: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
f500: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
f510: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
f520: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
f530: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
f540: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
f550: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  */.  int iCellFi
f560: 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74  rst;    /* First
f570: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
f580: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
f590: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  set */.  int iCe
f5a0: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c  llLast;     /* L
f5b0: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
f5c0: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
f5d0: 66 66 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ffset */..  asse
f5e0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
f5f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
f600: 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30  Page->pBt->db!=0
f610: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
f620: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f630: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
f640: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
f650: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
f660: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
f670: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
f680: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
f690: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
f6a0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
f6b0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
f6c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
f6d0: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
f6e0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
f6f0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
f700: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
f710: 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  age->isInit==0 )
f720: 3b 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  ;..  pBt = pPage
f730: 2d 3e 70 42 74 3b 0a 20 20 68 64 72 20 3d 20 70  ->pBt;.  hdr = p
f740: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
f750: 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
f760: 3e 61 44 61 74 61 3b 0a 20 20 2f 2a 20 45 56 49  >aData;.  /* EVI
f770: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39  DENCE-OF: R-2859
f780: 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d  4-02890 The one-
f790: 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66  byte flag at off
f7a0: 73 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67  set 0 indicating
f7b0: 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65  .  ** the b-tree
f7c0: 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20   page type. */. 
f7d0: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
f7e0: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
f7f0: 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ]) ){.    return
f800: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f810: 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
f820: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
f830: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
f840: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
f850: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
f860: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
f870: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
f880: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
f890: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
f8a0: 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  = 0;.  usableSiz
f8b0: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
f8c0: 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  ize;.  pPage->ce
f8d0: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
f8e0: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20  ffset = hdr + 8 
f8f0: 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
f900: 72 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e  rSize;.  pPage->
f910: 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61  aDataEnd = &data
f920: 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  [usableSize];.  
f930: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
f940: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
f950: 65 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  et];.  pPage->aD
f960: 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b  ataOfst = &data[
f970: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
f980: 69 7a 65 5d 3b 0a 20 20 2f 2a 20 45 56 49 44 45  ize];.  /* EVIDE
f990: 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d  NCE-OF: R-58015-
f9a0: 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79  48175 The two-by
f9b0: 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
f9c0: 66 73 65 74 20 35 20 64 65 73 69 67 6e 61 74 65  fset 5 designate
f9d0: 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74  s.  ** the start
f9e0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
f9f0: 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72  tent area. A zer
fa00: 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  o value for this
fa10: 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20 2a 2a   integer is.  **
fa20: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
fa30: 36 35 35 33 36 2e 20 2a 2f 0a 20 20 74 6f 70 20  65536. */.  top 
fa40: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
fa50: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
fa60: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
fa70: 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34  F: R-37002-32774
fa80: 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
fa90: 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
faa0: 33 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a  3 gives the.  **
fab0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
fac0: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f   on the page. */
fad0: 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
fae0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
faf0: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20  [hdr+3]);.  if( 
fb00: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
fb10: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
fb20: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
fb30: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
fb40: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
fb50: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
fb60: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
fb70: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
fb80: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
fb90: 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70   }.  testcase( p
fba0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f  Page->nCell==MX_
fbb0: 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 2f  CELL(pBt) );.  /
fbc0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
fbd0: 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20  -24089-57979 If 
fbe0: 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  a page contains 
fbf0: 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20  no cells (which 
fc00: 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73  is only.  ** pos
fc10: 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74  sible for a root
fc20: 20 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65   page of a table
fc30: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e   that contains n
fc40: 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65  o rows) then the
fc50: 0a 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20  .  ** offset to 
fc60: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
fc70: 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c   area will equal
fc80: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   the page size m
fc90: 69 6e 75 73 20 74 68 65 0a 20 20 2a 2a 20 62 79  inus the.  ** by
fca0: 74 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20  tes of reserved 
fcb0: 73 70 61 63 65 2e 20 2a 2f 0a 20 20 61 73 73 65  space. */.  asse
fcc0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
fcd0: 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c  >0 || top==usabl
fce0: 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54  eSize || CORRUPT
fcf0: 5f 44 42 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 6d  _DB );..  /* A m
fd00: 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  alformed databas
fd10: 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75  e page might cau
fd20: 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61  se us to read pa
fd30: 73 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20  st the end.  ** 
fd40: 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72  of page when par
fd50: 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20  sing a cell.  . 
fd60: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c   **.  ** The fol
fd70: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20  lowing block of 
fd80: 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c  code checks earl
fd90: 79 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65  y to see if a ce
fda0: 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 2a 2a 20  ll extends.  ** 
fdb0: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
fdc0: 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20  a page boundary 
fdd0: 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54  and causes SQLIT
fde0: 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20  E_CORRUPT to be 
fdf0: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  .  ** returned i
fe00: 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a  f it does..  */.
fe10: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
fe20: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
fe30: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 43  age->nCell;.  iC
fe40: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
fe50: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 69 66 28 20  Size - 4;.  if( 
fe60: 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  pBt->db->flags &
fe70: 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65   SQLITE_CellSize
fe80: 43 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  Ck ){.    int i;
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
fea0: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
feb0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
fec0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 3b 20   */.    int sz; 
fed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
fee0: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a  e of a cell */..
fef0: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
ff00: 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
ff10: 2d 2d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  --;.    for(i=0;
ff20: 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
ff30: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 63 20   i++){.      pc 
ff40: 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65  = get2byteAligne
ff50: 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  d(&data[cellOffs
ff60: 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  et+i*2]);.      
ff70: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
ff80: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
ff90: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
ffa0: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
ffb0: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
ffc0: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
ffd0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
ffe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
fff0: 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67 65  RRUPT_PGNO(pPage
10000 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
10010 0a 20 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67  .      sz = pPag
10020 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
10030 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a  ge, &data[pc]);.
10040 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10050 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a  pc+sz==usableSiz
10060 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e );.      if( p
10070 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20  c+sz>usableSize 
10080 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
10090 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
100a0 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e  _PGNO(pPage->pgn
100b0 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
100c0 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  }.    if( !pPage
100d0 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
100e0 73 74 2b 2b 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f  st++;.  }  ..  /
100f0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
10100 74 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f  tal free space o
10110 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20  n the page.  ** 
10120 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
10130 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20 74  3588-34450 The t
10140 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
10150 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76 65  at offset 1 give
10160 73 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74  s the.  ** start
10170 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 72   of the first fr
10180 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  eeblock on the p
10190 61 67 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20  age, or is zero 
101a0 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  if there are no.
101b0 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e    ** freeblocks.
101c0 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62   */.  pc = get2b
101d0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
101e0 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74  );.  nFree = dat
101f0 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20  a[hdr+7] + top; 
10200 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74   /* Init nFree t
10210 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20  o non-freeblock 
10220 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20  free space */.  
10230 69 66 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20  if( pc>0 ){.    
10240 75 33 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u32 next, size;.
10250 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
10260 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 2f  First ){.      /
10270 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
10280 2d 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20  -55530-52930 In 
10290 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d  a well-formed b-
102a0 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 72 65  tree page, there
102b0 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61   will.      ** a
102c0 6c 77 61 79 73 20 62 65 20 61 74 20 6c 65 61 73  lways be at leas
102d0 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72  t one cell befor
102e0 65 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  e the first free
102f0 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  block..      */.
10300 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10310 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
10320 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 20 0a  (pPage->pgno); .
10330 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
10340 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   1 ){.      if( 
10350 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
10360 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62          /* Freeb
10370 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65 6e 64  lock off the end
10380 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
10390 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
103a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
103b0 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  NO(pPage->pgno);
103c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
103d0 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26  ext = get2byte(&
103e0 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
103f0 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
10400 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
10410 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
10420 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
10430 20 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69   if( next<=pc+si
10440 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20 20  ze+3 ) break;.  
10450 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
10460 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 65 78     }.    if( nex
10470 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  t>0 ){.      /* 
10480 46 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e  Freeblock not in
10490 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
104a0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
104b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
104c0 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f  PGNO(pPage->pgno
104d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
104e0 20 70 63 2b 73 69 7a 65 3e 28 75 6e 73 69 67 6e   pc+size>(unsign
104f0 65 64 20 69 6e 74 29 75 73 61 62 6c 65 53 69 7a  ed int)usableSiz
10500 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 61  e ){.      /* La
10510 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 65 78 74  st freeblock ext
10520 65 6e 64 73 20 70 61 73 74 20 70 61 67 65 20 65  ends past page e
10530 6e 64 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  nd */.      retu
10540 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10550 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67  T_PGNO(pPage->pg
10560 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  no);.    }.  }..
10570 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
10580 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69  nt, nFree contai
10590 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ns the sum of th
105a0 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
105b0 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
105c0 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
105d0 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
105e0 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
105f0 73 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68  s within.  ** th
10600 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
10610 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
10620 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
10630 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a   usable-size.  *
10640 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
10650 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
10660 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
10670 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
10680 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
10690 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
106a0 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
106b0 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
106c0 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61  ontent.  ** area
106d0 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
106e0 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20  he page header, 
106f0 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  lies within the 
10700 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
10710 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
10720 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
10730 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10740 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
10750 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
10760 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72  Free = (u16)(nFr
10770 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29  ee - iCellFirst)
10780 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
10790 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  t = 1;.  return 
107a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
107b0 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
107c0 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
107d0 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
107e0 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
107f0 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
10800 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
10810 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
10820 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
10830 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
10840 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
10850 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
10860 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10870 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
10880 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
10890 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
108a0 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
108b0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
108c0 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
108d0 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
108e0 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
108f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
10900 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
10910 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
10920 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
10930 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
10940 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
10950 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
10960 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
10970 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
10980 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
10990 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
109a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
109b0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
109c0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  );.  if( pBt->bt
109d0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53  sFlags & BTS_FAS
109e0 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20  T_SECURE ){.    
109f0 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
10a00 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ], 0, pBt->usabl
10a10 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20  eSize - hdr);.  
10a20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  }.  data[hdr] = 
10a30 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66  (char)flags;.  f
10a40 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66  irst = hdr + ((f
10a50 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
10a60 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d  0 ? 12 : 8);.  m
10a70 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
10a80 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
10a90 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
10aa0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
10ab0 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
10ac0 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
10ad0 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
10ae0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
10af0 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
10b00 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
10b10 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
10b20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
10b30 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  st;.  pPage->aDa
10b40 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42  taEnd = &data[pB
10b50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  t->usableSize];.
10b60 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
10b70 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d  x = &data[first]
10b80 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
10b90 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
10ba0 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
10bb0 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ];.  pPage->nOve
10bc0 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73  rflow = 0;.  ass
10bd0 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
10be0 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
10bf0 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
10c00 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  );.  pPage->mask
10c10 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74  Page = (u16)(pBt
10c20 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  ->pageSize - 1);
10c30 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
10c40 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  = 0;.  pPage->is
10c50 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  Init = 1;.}.../*
10c60 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62  .** Convert a Db
10c70 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72  Page obtained fr
10c80 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74  om the pager int
10c90 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64  o a MemPage used
10ca0 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   by.** the btree
10cb0 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   layer..*/.stati
10cc0 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
10cd0 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44  PageFromDbPage(D
10ce0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  bPage *pDbPage, 
10cf0 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61  Pgno pgno, BtSha
10d00 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
10d10 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d  Page *pPage = (M
10d20 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
10d30 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
10d40 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67 6e  Page);.  if( pgn
10d50 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  o!=pPage->pgno )
10d60 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61  {.    pPage->aDa
10d70 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
10d80 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
10d90 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 44  );.    pPage->pD
10da0 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
10db0 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20  .    pPage->pBt 
10dc0 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67 65  = pBt;.    pPage
10dd0 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
10de0 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66     pPage->hdrOff
10df0 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20  set = pgno==1 ? 
10e00 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61  100 : 0;.  }.  a
10e10 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
10e20 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  ata==sqlite3Page
10e30 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
10e40 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ) );.  return pP
10e50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
10e60 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
10e70 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
10e80 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
10e90 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
10ea0 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
10eb0 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20  nts if needed.  
10ec0 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47  See also: btreeG
10ed0 65 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a  etUnusedPage()..
10ee0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47  **.** If the PAG
10ef0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
10f00 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
10f10 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
10f20 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62  o not care.** ab
10f30 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  out the content 
10f40 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
10f50 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
10f60 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
10f70 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
10f80 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
10f90 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
10fa0 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
10fb0 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
10fc0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
10fd0 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
10fe0 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
10ff0 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
11000 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
11010 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
11020 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
11030 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
11040 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
11050 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
11060 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
11070 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65  int btreeGetPage
11080 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
11090 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
110a0 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
110b0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
110c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
110d0 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
110e0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
110f0 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
11100 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
11110 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
11120 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
11130 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
11140 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
11150 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
11160 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
11170 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
11180 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
11190 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
111a0 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
111b0 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61  NOCONTENT || fla
111c0 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45  gs==PAGER_GET_RE
111d0 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65  ADONLY );.  asse
111e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
111f0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
11200 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
11210 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
11220 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
11230 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
11240 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ge, flags);.  if
11250 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
11260 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  ;.  *ppPage = bt
11270 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
11280 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
11290 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   pBt);.  return 
112a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
112b0 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70  .** Retrieve a p
112c0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
112d0 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
112e0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
112f0 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  is not.** alread
11300 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  y in the pager c
11310 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ache return NULL
11320 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  . Initialize the
11330 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
11340 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
11350 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
11360 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
11370 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
11380 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65  geLookup(BtShare
11390 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
113a0 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
113b0 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
113c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
113d0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
113e0 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
113f0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
11400 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
11410 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
11420 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
11430 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  n btreePageFromD
11440 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
11450 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20  gno, pBt);.  }. 
11460 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
11470 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
11480 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
11490 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
114a0 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
114b0 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72  ny kind of.** er
114c0 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e  ror, return ((un
114d0 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a  signed int)-1)..
114e0 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62  */.static Pgno b
114f0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74  treePagecount(Bt
11500 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
11510 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67  return pBt->nPag
11520 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33  e;.}.u32 sqlite3
11530 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74  BtreeLastPage(Bt
11540 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
11550 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
11560 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
11570 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70    assert( ((p->p
11580 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30  Bt->nPage)&0x800
11590 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  0000)==0 );.  re
115a0 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f  turn btreePageco
115b0 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a  unt(p->pBt);.}..
115c0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65  /*.** Get a page
115d0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
115e0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
115f0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72  t..**.** If pCur
11600 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67  !=0 then the pag
11610 65 20 69 73 20 62 65 69 6e 67 20 66 65 74 63 68  e is being fetch
11620 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ed as part of a 
11630 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a  moveToChild().**
11640 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74   call.  Do addit
11650 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65  ional sanity che
11660 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
11670 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
11680 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66 65  ** And if the fe
11690 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20  tch fails, this 
116a0 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63  routine must dec
116b0 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61  rement pCur->iPa
116c0 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
116d0 67 65 20 69 73 20 66 65 74 63 68 65 64 20 61 73  ge is fetched as
116e0 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65   read-write unle
116f0 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e  ss pCur is not N
11700 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20  ULL and is.** a 
11710 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
11720 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
11730 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
11740 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64 65   *ppPage is unde
11750 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
11760 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
11770 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
11780 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
11790 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
117a0 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
117b0 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
117c0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
117d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
117e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
117f0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11810 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11820 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
11830 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
11840 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
11850 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
11860 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
11870 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ere */.  BtCurso
11880 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
11890 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
118a0 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20 74 68  or to receive th
118b0 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20  e page, or NULL 
118c0 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e  */.  int bReadOn
118d0 6c 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ly              
118e0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
118f0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67   a read-only pag
11900 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
11910 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
11920 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  age;.  assert( s
11930 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11940 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
11950 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d  .  assert( pCur=
11960 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70  =0 || ppPage==&p
11970 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
11980 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
11990 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
119a0 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72   bReadOnly==pCur
119b0 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20  ->curPagerFlags 
119c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
119d0 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50  r==0 || pCur->iP
119e0 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20  age>0 );..  if( 
119f0 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  pgno>btreePageco
11a00 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
11a10 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
11a20 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
11a30 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
11a40 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72  e_error;.  }.  r
11a50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11a60 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
11a70 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
11a80 29 26 70 44 62 50 61 67 65 2c 20 62 52 65 61 64  )&pDbPage, bRead
11a90 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63 20  Only);.  if( rc 
11aa0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  ){.    goto getA
11ab0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
11ac0 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
11ad0 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
11ae0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
11af0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
11b00 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
11b10 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74 72  it==0 ){.    btr
11b20 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
11b30 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
11b40 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  pBt);.    rc = b
11b50 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
11b60 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
11b70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11b80 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
11b90 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
11ba0 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
11bb0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20  tPage_error;.   
11bc0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
11bd0 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f   (*ppPage)->pgno
11be0 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ==pgno );.  asse
11bf0 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 61  rt( (*ppPage)->a
11c00 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67  Data==sqlite3Pag
11c10 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
11c20 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  e) );..  /* If o
11c30 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64  btaining a child
11c40 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73   page for a curs
11c50 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69  or, we must veri
11c60 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
11c70 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69   is.  ** compati
11c80 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f  ble with the roo
11c90 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28  t page. */.  if(
11ca0 20 70 43 75 72 20 26 26 20 28 28 2a 70 70 50 61   pCur && ((*ppPa
11cb0 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20  ge)->nCell<1 || 
11cc0 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65  (*ppPage)->intKe
11cd0 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  y!=pCur->curIntK
11ce0 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ey) ){.    rc = 
11cf0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d00 47 4e 4f 28 70 67 6e 6f 29 3b 0a 20 20 20 20 72  GNO(pgno);.    r
11d10 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
11d20 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65  ge);.    goto ge
11d30 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
11d40 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
11d50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74   SQLITE_OK;..get
11d60 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
11d70 72 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 20  r:.  if( pCur ) 
11d80 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
11d90 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
11da0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
11db0 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  pgno!=0 || rc==S
11dc0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b  QLITE_CORRUPT );
11dd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11de0 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
11df0 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
11e00 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
11e10 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
11e20 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
11e30 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
11e40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
11e50 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
11e60 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
11e70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11e80 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
11e90 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
11ea0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
11eb0 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29  ge->pDbPage!=0 )
11ec0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11ed0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
11ee0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
11ef0 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
11f00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
11f10 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
11f20 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
11f30 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20  )==pPage->aData 
11f40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11f50 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11f60 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
11f70 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  x) );.  sqlite3P
11f80 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
11f90 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
11fa0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
11fb0 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
11fc0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
11fd0 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65 61  f( pPage ) relea
11fe0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50  sePageNotNull(pP
11ff0 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age);.}../*.** G
12000 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67  et an unused pag
12010 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  e..**.** This wo
12020 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74  rks just like bt
12030 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69 74  reeGetPage() wit
12040 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a  h the addition:.
12050 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68  **.**   *  If th
12060 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
12070 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d  y in use for som
12080 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c  e other purpose,
12090 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
120a0 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20       release it 
120b0 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51  and return an SQ
120c0 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72 72  LITE_CURRUPT err
120d0 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65  or..**   *  Make
120e0 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69 74   sure the isInit
120f0 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a   flag is clear.*
12100 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
12110 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
12120 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12130 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
12140 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
12150 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
12160 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
12170 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
12180 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
12190 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
121a0 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
121b0 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
121c0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
121d0 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
121e0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
121f0 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
12200 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
12210 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
12220 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
12230 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  age, flags);.  i
12240 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12250 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
12260 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
12270 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
12280 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20  pDbPage)>1 ){.  
12290 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
122a0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
122b0 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
122c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
122d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
122e0 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67     }.    (*ppPag
122f0 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  e)->isInit = 0;.
12300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
12310 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
12320 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
12330 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
12340 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
12350 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
12360 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
12370 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
12380 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
12390 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
123a0 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
123b0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
123c0 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
123d0 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
123e0 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
123f0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
12400 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
12410 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
12420 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
12430 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
12440 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
12450 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
12460 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
12470 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
12480 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
12490 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29  t(DbPage *pData)
124a0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
124b0 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  ge;.  pPage = (M
124c0 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
124d0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
124e0 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
124f0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
12500 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
12510 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
12520 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
12530 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12540 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
12550 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
12560 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
12570 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  it = 0;.    if( 
12580 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
12590 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
125a0 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  1 ){.      /* pP
125b0 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  age might not be
125c0 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20   a btree page;  
125d0 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f  it might be an o
125e0 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
125f0 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20     ** or ptrmap 
12600 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70  page or a free p
12610 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63  age.  In those c
12620 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ases, the follow
12630 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ing.      ** cal
12640 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61  l to btreeInitPa
12650 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ge() will likely
12660 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
12670 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a  ORRUPT..      **
12680 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20   But no harm is 
12690 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41  done by this.  A
126a0 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d  nd it is very im
126b0 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20  portant that.   
126c0 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50     ** btreeInitP
126d0 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20  age() be called 
126e0 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70  on every btree p
126f0 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20  age so we make. 
12700 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c       ** the call
12710 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20   for every page 
12720 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f  that comes in fo
12730 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f  r re-initing. */
12740 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74  .      btreeInit
12750 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
12760 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12770 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
12780 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
12790 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
127a0 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  nt btreeInvokeBu
127b0 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
127c0 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65  pArg){.  BtShare
127d0 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
127e0 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
127f0 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
12800 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12810 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
12820 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
12830 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
12840 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
12850 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
12860 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  andler);.}../*.*
12870 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
12880 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
12890 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
128a0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
128b0 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
128c0 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
128d0 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65  .** then an ephe
128e0 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69  meral database i
128f0 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
12900 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
12910 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65  se might.** be e
12920 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65  xclusively in me
12930 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  mory, or it migh
12940 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73  t use a disk-bas
12950 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  ed memory cache.
12960 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20  .** Either way, 
12970 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  the ephemeral da
12980 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61  tabase will be a
12990 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
129a0 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71  eted .** when sq
129b0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
129c0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
129d0 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
129e0 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
129f0 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
12a00 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
12a10 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
12a20 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
12a30 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
12a40 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
12a50 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61  The "flags" para
12a60 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
12a70 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f  sk that might co
12a80 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a  ntain bits like.
12a90 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f  ** BTREE_OMIT_JO
12aa0 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52  URNAL and/or BTR
12ab0 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a  EE_MEMORY..**.**
12ac0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
12ad0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
12ae0 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
12af0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12b00 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  on.** and we are
12b10 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65   in shared cache
12b20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
12b30 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77  open will fail w
12b40 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ith an.** SQLITE
12b50 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f  _CONSTRAINT erro
12b60 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c  r.  We cannot al
12b70 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  low two or more 
12b80 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65  BtShared.** obje
12b90 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  cts in the same 
12ba0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12bb0 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20  ion since doing 
12bc0 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20  so will lead.** 
12bd0 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  to problems with
12be0 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   locking..*/.int
12bf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
12c00 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
12c10 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20   *pVfs,      /* 
12c20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74  VFS to use for t
12c30 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  his b-tree */.  
12c40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
12c50 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
12c60 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
12c70 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
12c80 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
12c90 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
12ca0 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
12cb0 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ated database ha
12cc0 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ndle */.  Btree 
12cd0 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20  **ppBtree,      
12ce0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
12cf0 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74  new Btree object
12d00 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
12d10 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
12d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
12d30 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76  tions */.  int v
12d40 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
12d50 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
12d60 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
12d70 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
12d80 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  ) */.){.  BtShar
12d90 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
12da0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
12db0 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65  ed part of btree
12dc0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
12dd0 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20  Btree *p;       
12de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12df0 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75  * Handle to retu
12e00 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rn */.  sqlite3_
12e10 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e  mutex *mutexOpen
12e20 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e   = 0;  /* Preven
12e30 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  ts a race condit
12e40 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33  ion. Ticket #353
12e50 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  7 */.  int rc = 
12e60 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
12e70 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
12e80 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66  code from this f
12e90 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  unction */.  u8 
12ea0 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20  nReserve;       
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
12ec0 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70  yte of unused sp
12ed0 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
12ee0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
12ef0 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30  har zDbHeader[10
12f00 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  0];  /* Database
12f10 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20   header content 
12f20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66  */..  /* True if
12f30 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65   opening an ephe
12f40 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79  meral, temporary
12f50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
12f60 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44  onst int isTempD
12f70 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  b = zFilename==0
12f80 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
12f90 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ==0;..  /* Set t
12fa0 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65  he variable isMe
12fb0 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20  mdb to true for 
12fc0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
12fd0 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20  abase, or .  ** 
12fe0 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65  false for a file
12ff0 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e  -based database.
13000 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
13010 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
13020 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  B.  const int is
13030 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65  Memdb = 0;.#else
13040 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
13050 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d  emdb = (zFilenam
13060 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c  e && strcmp(zFil
13070 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
13080 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20  ")==0).         
13090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
130a0 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71   (isTempDb && sq
130b0 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
130c0 79 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20  y(db)).         
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
130e0 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
130f0 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29  ITE_OPEN_MEMORY)
13100 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  !=0;.#endif..  a
13110 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
13120 20 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d    assert( pVfs!=
13130 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
13140 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13150 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
13160 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
13170 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b  &0xff)==flags );
13180 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20     /* flags fit 
13190 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20  in 8 bits */..  
131a0 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f  /* Only a BTREE_
131b0 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20  SINGLE database 
131c0 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f  can be BTREE_UNO
131d0 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65  RDERED */.  asse
131e0 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52  rt( (flags & BTR
131f0 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30  EE_UNORDERED)==0
13200 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52   || (flags & BTR
13210 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b  EE_SINGLE)!=0 );
13220 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53  ..  /* A BTREE_S
13230 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69  INGLE database i
13240 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f  s always a tempo
13250 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65  rary and/or ephe
13260 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72  meral */.  asser
13270 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
13280 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20  E_SINGLE)==0 || 
13290 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69  isTempDb );..  i
132a0 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  f( isMemdb ){.  
132b0 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45    flags |= BTREE
132c0 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69  _MEMORY;.  }.  i
132d0 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  f( (vfsFlags & S
132e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
132f0 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d  DB)!=0 && (isMem
13300 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20  db || isTempDb) 
13310 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20  ){.    vfsFlags 
13320 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53  = (vfsFlags & ~S
13330 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
13340 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  DB) | SQLITE_OPE
13350 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20  N_TEMP_DB;.  }. 
13360 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
13370 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
13380 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20  ree));.  if( !p 
13390 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
133a0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
133b0 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e  .  }.  p->inTran
133c0 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
133d0 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69    p->db = db;.#i
133e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
133f0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
13400 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20   p->lock.pBtree 
13410 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69  = p;.  p->lock.i
13420 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69  Table = 1;.#endi
13430 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
13440 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
13450 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
13460 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13470 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20  T_DISKIO).  /*. 
13480 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65   ** If this Btre
13490 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  e is a candidate
134a0 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68   for shared cach
134b0 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61  e, try to find a
134c0 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20  n.  ** existing 
134d0 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
134e0 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72  that we can shar
134f0 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66  e with.  */.  if
13500 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26  ( isTempDb==0 &&
13510 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20   (isMemdb==0 || 
13520 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
13530 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29  _OPEN_URI)!=0) )
13540 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61  {.    if( vfsFla
13550 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
13560 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a  _SHAREDCACHE ){.
13570 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e        int nFilen
13580 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
13590 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
135a0 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46  +1;.      int nF
135b0 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56  ullPathname = pV
135c0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
135d0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46  ;.      char *zF
135e0 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
135f0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28  lite3Malloc(MAX(
13600 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46  nFullPathname,nF
13610 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ilename));.     
13620 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
13630 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
13640 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20  exShared; )..   
13650 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
13660 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a   1;.      if( !z
13670 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
13680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13690 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
136a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
136b0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
136c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d   }.      if( isM
136d0 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20  emdb ){.        
136e0 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68  memcpy(zFullPath
136f0 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  name, zFilename,
13700 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   nFilename);.   
13710 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13720 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13730 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
13740 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  s, zFilename,.  
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13770 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
13780 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
13790 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
137a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
137b0 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
137c0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
137d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
137e0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
137f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
13800 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53   }.      }.#if S
13810 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
13820 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
13830 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
13840 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
13850 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
13860 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
13870 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
13880 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
13890 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
138a0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
138b0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
138c0 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
138d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
138e0 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
138f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
13900 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
13910 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
13920 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
13930 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
13940 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
13950 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
13960 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
13970 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
13980 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
13990 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
139a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a  Bt->pPager, 0)).
139b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139c0 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
139d0 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
139e0 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
139f0 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
13a00 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
13a10 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
13a20 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
13a30 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
13a40 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
13a50 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
13a60 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
13a70 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
13a80 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
13aa0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
13ab0 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
13ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
13ad0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
13ae0 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
13af0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
13b00 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
13b10 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
13b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
13b30 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
13b40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13b50 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
13b60 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
13b70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13b80 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
13b90 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
13ba0 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
13bb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13bc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
13bd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
13be0 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
13bf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13c00 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
13c10 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
13c20 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
13c30 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
13c40 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
13c50 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
13c60 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
13c70 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
13c80 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
13c90 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
13ca0 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
13cb0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
13cc0 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
13cd0 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
13ce0 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
13cf0 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
13d00 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
13d10 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
13d20 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
13d30 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
13d40 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
13d50 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
13d60 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
13d70 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
13d80 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
13d90 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
13da0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
13db0 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
13dc0 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
13dd0 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
13de0 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
13df0 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
13e00 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
13e10 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
13e20 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
13e30 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
13e40 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
13e50 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
13e60 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
13e70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
13e80 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b  izeof(u64)==8 );
13e90 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
13ea0 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
13eb0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
13ec0 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
13ed0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
13ee0 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
13ef0 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
13f00 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
13f10 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
13f20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
13f30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13f40 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
13f50 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
13f60 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
13f70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
13f80 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
13f90 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
13fa0 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fc0 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 2c  sizeof(MemPage),
13fd0 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
13fe0 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
13ff0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14000 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
14010 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
14020 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
14030 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b  er, db->szMmap);
14040 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14050 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
14060 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
14070 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
14080 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
14090 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
140a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
140b0 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
140c0 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
140d0 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
140e0 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
140f0 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
14100 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
14110 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
14120 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
14130 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
14140 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
14150 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
14160 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
14170 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
14180 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
14190 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
141a0 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
141b0 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e  >pPager) ) pBt->
141c0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
141d0 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 20 64  READ_ONLY;.#if d
141e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 45  efined(SQLITE_SE
141f0 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20  CURE_DELETE).   
14200 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
14210 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  = BTS_SECURE_DEL
14220 45 54 45 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  ETE;.#elif defin
14230 65 64 28 53 51 4c 49 54 45 5f 46 41 53 54 5f 53  ed(SQLITE_FAST_S
14240 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20  ECURE_DELETE).  
14250 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
14260 7c 3d 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  |= BTS_OVERWRITE
14270 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
14280 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
14290 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70  1873-39618 The p
142a0 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64  age size for a d
142b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a  atabase file is.
142c0 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
142d0 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20  d by the 2-byte 
142e0 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20  integer located 
142f0 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
14300 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20  16 bytes from.  
14310 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69    ** the beginni
14320 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ng of the databa
14330 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
14340 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
14350 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c  (zDbHeader[16]<<
14360 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b  8) | (zDbHeader[
14370 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66  17]<<16);.    if
14380 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
14390 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
143a0 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
143b0 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
143c0 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67     || ((pBt->pag
143d0 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61  eSize-1)&pBt->pa
143e0 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
143f0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
14400 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  e = 0;.#ifndef S
14410 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
14420 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
14430 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  f the magic name
14440 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c   ":memory:" will
14450 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65   create an in-me
14460 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74  mory database, t
14470 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61  hen.      ** lea
14480 76 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75  ve the autoVacuu
14490 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20  m mode at 0 (do 
144a0 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29  not auto-vacuum)
144b0 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20  , even if.      
144c0 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ** SQLITE_DEFAUL
144d0 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
144e0 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68  true. On the oth
144f0 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20  er hand, if.    
14500 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    ** SQLITE_OMIT
14510 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65  _MEMORYDB has be
14520 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  en defined, then
14530 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a   ":memory:" is j
14540 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72  ust a.      ** r
14550 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65  egular file-name
14560 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
14570 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61  he auto-vacuum a
14580 70 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f  pplies as per no
14590 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rmal..      */. 
145a0 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61       if( zFilena
145b0 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29  me && !isMemdb )
145c0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61  {.        pBt->a
145d0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c  utoVacuum = (SQL
145e0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
145f0 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b  VACUUM ? 1 : 0);
14600 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
14610 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  crVacuum = (SQLI
14620 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
14630 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30  ACUUM==2 ? 1 : 0
14640 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
14650 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65  f.      nReserve
14660 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
14670 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
14680 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
14690 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
146a0 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
146b0 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a  gion is.      **
146c0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
146d0 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69  he one-byte unsi
146e0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75  gned integer fou
146f0 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  nd at an offset 
14700 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69  of 20.      ** i
14710 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
14720 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f   file header. */
14730 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
14740 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b  = zDbHeader[20];
14750 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
14760 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
14770 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
14780 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14790 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
147a0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
147b0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
147c0 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34  bHeader[36 + 4*4
147d0 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70  ])?1:0);.      p
147e0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
147f0 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
14800 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29  eader[36 + 7*4])
14810 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
14820 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
14830 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
14840 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
14850 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
14860 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20  , nReserve);.   
14870 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
14880 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
14890 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
148a0 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
148b0 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
148c0 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d     assert( (pBt-
148d0 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  >pageSize & 7)==
148e0 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20  0 );  /* 8-byte 
148f0 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67  alignment of pag
14900 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66  eSize */.   .#if
14910 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14920 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
14930 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
14940 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
14950 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
14960 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
14970 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
14980 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
14990 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
149a0 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6e 52    */.    pBt->nR
149b0 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ef = 1;.    if( 
149c0 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
149d0 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
149e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
149f0 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
14a00 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
14a10 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d  C( mutexShared =
14a20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
14a30 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
14a40 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29  STATIC_MASTER);)
14a50 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
14a60 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
14a70 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
14a80 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29  fig.bCoreMutex )
14a90 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d  {.        pBt->m
14aa0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
14ab0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
14ac0 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
14ad0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75       if( pBt->mu
14ae0 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
14af0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14b00 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
14b10 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
14b20 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
14b30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14b40 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14b50 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
14b60 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
14b70 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
14b80 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
14b90 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
14ba0 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
14bb0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
14bc0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
14bd0 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
14be0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14bf0 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
14c00 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
14c10 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
14c20 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
14c30 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
14c40 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
14c50 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
14c60 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
14c70 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
14c80 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
14c90 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
14ca0 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
14cb0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
14cc0 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
14cd0 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
14ce0 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
14cf0 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
14d00 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
14d10 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
14d20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
14d30 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
14d40 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
14d50 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
14d60 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
14d70 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
14d80 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
14d90 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
14da0 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
14db0 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
14dc0 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
14dd0 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
14de0 20 20 20 20 20 20 20 20 69 66 28 20 28 75 70 74          if( (upt
14df0 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72 29 70  r)p->pBt<(uptr)p
14e00 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  Sib->pBt ){.    
14e10 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
14e20 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
14e30 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
14e40 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
14e50 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
14e60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14e70 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
14e80 70 4e 65 78 74 20 26 26 20 28 75 70 74 72 29 70  pNext && (uptr)p
14e90 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
14ea0 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29 7b 0a  (uptr)p->pBt ){.
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62              pSib
14ec0 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
14ed0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14ee0 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
14ef0 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
14f00 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
14f10 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
14f20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20     if( p->pNext 
14f30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
14f40 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
14f50 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   p;.          }.
14f60 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
14f70 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
14f80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
14f90 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
14fa0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  }.  }.#endif.  *
14fb0 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74  ppBtree = p;..bt
14fc0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20  ree_open_out:.  
14fd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14fe0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
14ff0 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
15000 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15010 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
15020 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
15030 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
15040 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ee(pBt);.    sql
15050 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
15060 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a    *ppBtree = 0;.
15070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
15080 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
15090 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
150a0 20 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63   B-Tree was succ
150b0 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c  essfully opened,
150c0 20 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63   set the pager-c
150d0 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65  ache size to the
150e0 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  .    ** default 
150f0 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77  value. Except, w
15100 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61  hen opening on a
15110 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65  n existing share
15120 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20  d pager-cache,. 
15130 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61     ** do not cha
15140 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61  nge the pager-ca
15150 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  che size..    */
15160 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
15170 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30  BtreeSchema(p, 0
15180 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)==0 ){.     
15190 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
151a0 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74  Cachesize(p->pBt
151b0 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45  ->pPager, SQLITE
151c0 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
151d0 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  IZE);.    }..   
151e0 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   pFile = sqlite3
151f0 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
15200 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
15210 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
15220 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15230 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
15240 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f  t(pFile, SQLITE_
15250 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f 69 64  FCNTL_PDB, (void
15260 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20 20 20  *)&pBt->db);.   
15270 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74   }.  }.  if( mut
15280 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73  exOpen ){.    as
15290 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
152a0 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70  tex_held(mutexOp
152b0 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  en) );.    sqlit
152c0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
152d0 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20  utexOpen);.  }. 
152e0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
152f0 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
15300 33 42 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e  3BtreeConnection
15310 43 6f 75 6e 74 28 2a 70 70 42 74 72 65 65 29 3e  Count(*ppBtree)>
15320 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
15330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
15340 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
15350 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
15360 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
15370 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
15380 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
15390 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
153a0 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
153b0 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
153c0 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
153d0 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
153e0 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
153f0 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
15400 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
15410 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
15420 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
15430 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
15440 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
15450 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
15460 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54  ARED_CACHE.  MUT
15470 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
15480 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
15490 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ; ).  BtShared *
154a0 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d  pList;.  int rem
154b0 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73  oved = 0;..  ass
154c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
154d0 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e  ex_notheld(pBt->
154e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45  mutex) );.  MUTE
154f0 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72  X_LOGIC( pMaster
15500 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
15510 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
15520 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
15530 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ; ).  sqlite3_mu
15540 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
15550 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d  r);.  pBt->nRef-
15560 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52  -;.  if( pBt->nR
15570 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef<=0 ){.    if(
15580 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
15590 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
155a0 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29  acheList)==pBt )
155b0 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  {.      GLOBAL(B
155c0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
155d0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
155e0 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
155f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15600 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pList = GLOBAL(B
15610 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
15620 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
15630 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41  ;.      while( A
15640 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20  LWAYS(pList) && 
15650 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42  pList->pNext!=pB
15660 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  t ){.        pLi
15670 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b  st=pList->pNext;
15680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15690 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  f( ALWAYS(pList)
156a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
156b0 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  t->pNext = pBt->
156c0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
156d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c     }.    if( SQL
156e0 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29  ITE_THREADSAFE )
156f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
15700 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e  mutex_free(pBt->
15710 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20  mutex);.    }.  
15720 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20    removed = 1;. 
15730 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
15740 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
15750 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f  );.  return remo
15760 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  ved;.#else.  ret
15770 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 1;.#endif.}.
15780 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
15790 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
157a0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c  points to an all
157b0 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d  ocation of .** M
157c0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
157d0 20 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d   bytes with a 4-
157e0 62 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20  byte prefix for 
157f0 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20  a left-child.** 
15800 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
15810 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65  ic void allocate
15820 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
15830 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
15840 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20  !pBt->pTmpSpace 
15850 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
15860 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
15870 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e  ageMalloc( pBt->
15880 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20  pageSize );..   
15890 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75   /* One of the u
158a0 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70  ses of pBt->pTmp
158b0 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d  Space is to form
158c0 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a  at cells before.
158d0 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67      ** inserting
158e0 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61   them into a lea
158f0 66 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e  f page (function
15900 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20   fillInCell()). 
15910 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c  If.    ** a cell
15920 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20   is less than 4 
15930 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69  bytes in size, i
15940 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20  t is rounded up 
15950 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a  to 4 bytes.    *
15960 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73  * by the various
15970 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d   routines that m
15980 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79  anipulate binary
15990 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20   cells. Which.  
159a0 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68    ** can mean th
159b0 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20  at fillInCell() 
159c0 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73  only initializes
159d0 20 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20   the first 2 or 
159e0 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f  3.    ** bytes o
159f0 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74  f pTmpSpace, but
15a00 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
15a10 34 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69  4 bytes are copi
15a20 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69  ed from.    ** i
15a30 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73  t into a databas
15a40 65 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20  e page. This is 
15a50 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70  not actually a p
15a60 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20  roblem, but it. 
15a70 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65     ** does cause
15a80 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f   a valgrind erro
15a90 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20  r when the 1 or 
15aa0 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69  2 bytes of uniti
15ab0 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64  alized .    ** d
15ac0 61 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f  ata is passed to
15ad0 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69   system call wri
15ae0 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69  te(). So to avoi
15af0 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20  d this error,.  
15b00 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69    ** zero the fi
15b10 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
15b20 65 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a  emp space here..
15b30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
15b40 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75  so:  Provide fou
15b50 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69  r bytes of initi
15b60 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66  alized space bef
15b70 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62  ore the.    ** b
15b80 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70  eginning of pTmp
15b90 53 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61  Space as an area
15ba0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72   available to pr
15bb0 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  epend the.    **
15bc0 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e   left-child poin
15bd0 74 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ter to the begin
15be0 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a  ning of a cell..
15bf0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
15c00 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
15c10 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42  .      memset(pB
15c20 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c  t->pTmpSpace, 0,
15c30 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e   8);.      pBt->
15c40 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a  pTmpSpace += 4;.
15c50 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15c60 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
15c70 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
15c80 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
15c90 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
15ca0 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
15cb0 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54  ){.  if( pBt->pT
15cc0 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
15cd0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d  Bt->pTmpSpace -=
15ce0 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   4;.    sqlite3P
15cf0 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d  ageFree(pBt->pTm
15d00 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74  pSpace);.    pBt
15d10 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b  ->pTmpSpace = 0;
15d20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
15d30 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61  ose an open data
15d40 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64  base and invalid
15d50 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ate all cursors.
15d60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15d70 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20  treeClose(Btree 
15d80 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
15d90 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
15da0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
15db0 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
15dc0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20   cursors opened 
15dd0 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e  via this handle.
15de0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
15df0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15e00 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
15e10 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15e20 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75  eEnter(p);.  pCu
15e30 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
15e40 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
15e50 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
15e60 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
15e70 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
15e80 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
15e90 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
15ea0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
15eb0 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
15ec0 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
15ed0 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
15ee0 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
15ef0 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
15f00 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
15f10 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
15f20 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
15f30 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
15f40 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
15f50 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
15f60 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
15f70 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
15f80 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49  Rollback(p, SQLI
15f90 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c  TE_OK, 0);.  sql
15fa0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15fb0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
15fc0 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65  e are still othe
15fd0 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  r outstanding re
15fe0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
15ff0 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a  shared-btree.  *
16000 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74  * structure, ret
16010 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d  urn now. The rem
16020 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70  ainder of this p
16030 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
16040 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61  .  ** up the sha
16050 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a  red-btree..  */.
16060 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
16070 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d  tToLock==0 && p-
16080 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
16090 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
160a0 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68   || removeFromSh
160b0 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29  aringList(pBt) )
160c0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74  {.    /* The pBt
160d0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e   is no longer on
160e0 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
160f0 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63  t, so we can acc
16100 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69  ess.    ** it wi
16110 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
16120 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a  hold the mutex..
16130 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c      **.    ** Cl
16140 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65  ean out and dele
16150 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  te the BtShared 
16160 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  object..    */. 
16170 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
16180 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
16190 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
161a0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
161b0 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20 70  ->db);.    if( p
161c0 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
161d0 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
161e0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
161f0 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
16200 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
16210 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16220 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  (0, pBt->pSchema
16230 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
16240 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
16250 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
16260 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
16270 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
16280 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
16290 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
162a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
162b0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
162c0 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
162d0 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
162e0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
162f0 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
16300 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
16310 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
16320 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
16330 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
16340 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16350 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f  * Change the "so
16360 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  ft" limit on the
16370 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
16380 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   in the cache..*
16390 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d  * Unused and unm
163a0 6f 64 69 66 69 65 64 20 70 61 67 65 73 20 77 69  odified pages wi
163b0 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20 77  ll be recycled w
163c0 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
163d0 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68  f.** pages in th
163e0 65 20 63 61 63 68 65 20 65 78 63 65 65 64 73 20  e cache exceeds 
163f0 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e  this soft limit.
16400 20 20 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f    But the size o
16410 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69  f the.** cache i
16420 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f  s allowed to gro
16430 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  w larger than th
16440 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63  is limit if it c
16450 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79  ontains.** dirty
16460 20 70 61 67 65 73 20 6f 72 20 70 61 67 65 73 20   pages or pages 
16470 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20  still in active 
16480 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
16490 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
164a0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
164b0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
164c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
164d0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
164e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
164f0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
16500 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
16510 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
16520 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
16530 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
16540 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
16550 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16560 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
16570 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16580 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 70  * Change the "sp
16590 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68  ill" limit on th
165a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
165b0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  s in the cache..
165c0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
165d0 20 6f 66 20 70 61 67 65 73 20 65 78 63 65 65 64   of pages exceed
165e0 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72  s this limit dur
165f0 69 6e 67 20 61 20 77 72 69 74 65 20 74 72 61 6e  ing a write tran
16600 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20  saction,.** the 
16610 70 61 67 65 72 20 6d 69 67 68 74 20 61 74 74 65  pager might atte
16620 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70  mpt to "spill" p
16630 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  ages to the jour
16640 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20  nal early in.** 
16650 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70  order to free up
16660 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
16670 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
16680 64 20 69 73 20 74 68 65 20 63 75 72 72 65 6e 74  d is the current
16690 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66   spill size.  If
166a0 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a   zero is passed.
166b0 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ** as an argumen
166c0 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  t, no changes ar
166d0 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70  e made to the sp
166e0 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67  ill size setting
166f0 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78  , so.** using mx
16700 50 61 67 65 20 6f 66 20 30 20 69 73 20 61 20 77  Page of 0 is a w
16710 61 79 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ay to query the 
16720 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69  current spill si
16730 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ze..*/.int sqlit
16740 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53  e3BtreeSetSpillS
16750 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
16760 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
16770 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
16780 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  pBt;.  int res;.
16790 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
167a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
167b0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
167c0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
167d0 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71  r(p);.  res = sq
167e0 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69  lite3PagerSetSpi
167f0 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  llsize(pBt->pPag
16800 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
16810 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16820 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  (p);.  return re
16830 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  s;.}..#if SQLITE
16840 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
16850 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
16860 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61  e limit on the a
16870 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74  mount of the dat
16880 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20  abase file that 
16890 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79  may be.** memory
168a0 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20   mapped..*/.int 
168b0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
168c0 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a  mapLimit(Btree *
168d0 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
168e0 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68   szMmap){.  BtSh
168f0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
16900 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
16910 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16920 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
16930 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16940 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
16950 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
16960 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
16970 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c  , szMmap);.  sql
16980 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16990 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
169a0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
169b0 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
169c0 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
169d0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
169e0 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
169f0 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
16a00 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
16a10 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
16a20 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
16a30 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
16a40 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
16a50 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
16a60 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
16a70 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
16a80 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
16a90 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
16aa0 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
16ab0 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
16ac0 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
16ad0 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
16ae0 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
16af0 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
16b00 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
16b10 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
16b20 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
16b30 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
16b40 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
16b50 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
16b60 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
16b70 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
16b80 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
16b90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16ba0 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
16bb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
16bc0 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42  tPagerFlags(.  B
16bd0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
16be0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
16bf0 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
16c00 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
16c10 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
16c20 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72  ags       /* Var
16c30 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61  ious PAGER_* fla
16c40 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  gs */.){.  BtSha
16c50 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
16c60 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
16c70 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16c80 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
16c90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16ca0 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
16cb0 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
16cc0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46  pBt->pPager, pgF
16cd0 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
16ce0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16cf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16d00 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
16d10 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
16d20 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
16d30 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
16d40 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
16d50 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f  s per page..** O
16d60 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  r, if the page s
16d70 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ize has already 
16d80 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75  been fixed, retu
16d90 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
16da0 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63  LY .** without c
16db0 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67  hanging anything
16dc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
16dd0 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20   size must be a 
16de0 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65  power of 2 betwe
16df0 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36  en 512 and 65536
16e00 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a  .  If the page.*
16e10 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20  * size supplied 
16e20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68  does not meet th
16e30 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68  is constraint th
16e40 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  en the page size
16e50 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67   is not.** chang
16e60 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73  ed..**.** Page s
16e70 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61  izes are constra
16e80 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77  ined to be a pow
16e90 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61  er of two so tha
16ea0 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20  t the region.** 
16eb0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
16ec0 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  file used for lo
16ed0 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67  cking (beginning
16ee0 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   at PENDING_BYTE
16ef0 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62  ,.** the first b
16f00 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42  yte past the 1GB
16f10 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30   boundary, 0x400
16f20 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20  00000) needs to 
16f30 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20  occur.** at the 
16f40 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70  beginning of a p
16f50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  age..**.** If pa
16f60 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65  rameter nReserve
16f70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
16f80 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ro, then the num
16f90 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a  ber of reserved.
16fa0 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ** bytes per pag
16fb0 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  e is left unchan
16fc0 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ged..**.** If th
16fd0 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74  e iFix!=0 then t
16fe0 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  he BTS_PAGESIZE_
16ff0 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73 65  FIXED flag is se
17000 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  t so that the pa
17010 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61  ge size.** and a
17020 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63  utovacuum mode c
17030 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  an no longer be 
17040 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
17050 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
17060 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
17070 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20  , int pageSize, 
17080 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e  int nReserve, in
17090 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72  t iFix){.  int r
170a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
170b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
170c0 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
170d0 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20  t( nReserve>=-1 
170e0 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35  && nReserve<=255
170f0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
17100 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20  eeEnter(p);.#if 
17110 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
17120 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e  .  if( nReserve>
17130 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
17140 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d  rve ) pBt->optim
17150 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38 29  alReserve = (u8)
17160 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66  nReserve;.#endif
17170 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
17180 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
17190 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20  IZE_FIXED ){.   
171a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
171b0 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
171c0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
171d0 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
171e0 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
171f0 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
17200 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
17210 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
17220 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
17230 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
17240 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70  <=255 );.  if( p
17250 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
17260 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
17270 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26  _MAX_PAGE_SIZE &
17280 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65  &.        ((page
17290 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
172a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
172b0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
172c0 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  7)==0 );.    ass
172d0 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
172e0 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  or );.    pBt->p
172f0 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70  ageSize = (u32)p
17300 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65  ageSize;.    fre
17310 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
17320 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
17330 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
17340 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
17350 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
17360 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42   nReserve);.  pB
17370 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
17380 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
17390 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (u16)nReserve;. 
173a0 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d   if( iFix ) pBt-
173b0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
173c0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
173d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
173e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
173f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
17400 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
17410 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
17420 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
17430 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
17440 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
17450 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
17460 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
17470 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
17480 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  n is similar to 
17490 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
174a0 65 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74  eserve(), except
174b0 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20   that it.** may 
174c0 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69  only be called i
174d0 66 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  f it is guarante
174e0 65 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72  ed that the b-tr
174f0 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65  ee mutex is alre
17500 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a  ady.** held..**.
17510 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75  ** This is usefu
17520 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c  l in one special
17530 20 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63   case in the bac
17540 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65  kup API code whe
17550 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77  re it is.** know
17560 6e 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65  n that the share
17570 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  d b-tree mutex i
17580 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20  s held, but the 
17590 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a  mutex on the .**
175a0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
175b0 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73   that owns *p is
175c0 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61   not. In this ca
175d0 73 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72  se if sqlite3Btr
175e0 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72  eeEnter().** wer
175f0 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20  e to be called, 
17600 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65  it might collide
17610 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72   with some other
17620 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68   operation on th
17630 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  e.** database ha
17640 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
17650 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66  p, causing undef
17660 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a  ined behavior..*
17670 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17680 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
17690 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tex(Btree *p){. 
176a0 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74   int n;.  assert
176b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
176c0 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74  held(p->pBt->mut
176d0 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  ex) );.  n = p->
176e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
176f0 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
17700 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  ze;.  return n;.
17710 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
17720 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
17730 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
17740 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
17750 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
17760 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
17770 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
17780 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
17790 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
177a0 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
177b0 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
177c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
177d0 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64  E_HAS_MUTEX is d
177e0 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20  efined then the 
177f0 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
17800 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65  is the.** greate
17810 72 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  r of the current
17820 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
17830 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  and the maximum 
17840 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73  requested.** res
17850 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69  erve space..*/.i
17860 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
17870 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  etOptimalReserve
17880 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
17890 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
178a0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
178b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
178c0 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
178d0 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  (p);.#ifdef SQLI
178e0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
178f0 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74  f( n<p->pBt->opt
17900 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20  imalReserve ) n 
17910 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  = p->pBt->optima
17920 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66  lReserve;.#endif
17930 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17940 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17950 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  n n;.}.../*.** S
17960 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
17970 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
17980 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
17990 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
179a0 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
179b0 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
179c0 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
179d0 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
179e0 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
179f0 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
17a00 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
17a10 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
17a20 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
17a30 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
17a40 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
17a50 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
17a60 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
17a70 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
17a80 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
17a90 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
17aa0 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
17ab0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17ac0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
17ad0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
17ae0 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 42  values for the B
17af0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
17b00 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49   and BTS_OVERWRI
17b10 54 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20  TE flags:.**.** 
17b20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 30 20 20 20     newFlag==0   
17b30 20 20 20 20 42 6f 74 68 20 42 54 53 5f 53 45 43      Both BTS_SEC
17b40 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20 42  URE_DELETE and B
17b50 54 53 5f 4f 56 45 52 57 52 49 54 45 20 61 72 65  TS_OVERWRITE are
17b60 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e   cleared.**    n
17b70 65 77 46 6c 61 67 3d 3d 31 20 20 20 20 20 20 20  ewFlag==1       
17b80 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
17b90 45 20 73 65 74 20 61 6e 64 20 42 54 53 5f 4f 56  E set and BTS_OV
17ba0 45 52 57 52 49 54 45 20 69 73 20 63 6c 65 61 72  ERWRITE is clear
17bb0 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67  ed.**    newFlag
17bc0 3d 3d 32 20 20 20 20 20 20 20 42 54 53 5f 53 45  ==2       BTS_SE
17bd0 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6c 65 61  CURE_DELETE clea
17be0 72 65 64 20 61 6e 64 20 42 54 53 5f 4f 56 45 52  red and BTS_OVER
17bf0 57 52 49 54 45 20 69 73 20 73 65 74 0a 2a 2a 20  WRITE is set.** 
17c00 20 20 20 6e 65 77 46 6c 61 67 3d 3d 28 2d 31 29     newFlag==(-1)
17c10 20 20 20 20 4e 6f 20 63 68 61 6e 67 65 73 0a 2a      No changes.*
17c20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17c30 65 20 61 63 74 73 20 61 73 20 61 20 71 75 65 72  e acts as a quer
17c40 79 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20  y if newFlag is 
17c50 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 0a 2a  less than zero.*
17c60 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 4f 56  *.** With BTS_OV
17c70 45 52 57 52 49 54 45 20 73 65 74 2c 20 64 65 6c  ERWRITE set, del
17c80 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20  eted content is 
17c90 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 7a  overwritten by z
17ca0 65 72 6f 73 2c 20 62 75 74 0a 2a 2a 20 66 72 65  eros, but.** fre
17cb0 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  elist leaf pages
17cc0 20 61 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e   are not written
17cd0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
17ce0 61 62 61 73 65 2e 20 20 54 68 75 73 20 69 6e 2d  abase.  Thus in-
17cf0 70 61 67 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  page.** deleted 
17d00 63 6f 6e 74 65 6e 74 20 69 73 20 63 6c 65 61 72  content is clear
17d10 65 64 2c 20 62 75 74 20 66 72 65 65 6c 69 73 74  ed, but freelist
17d20 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74   deleted content
17d30 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57   is not..**.** W
17d40 69 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44  ith BTS_SECURE_D
17d50 45 4c 45 54 45 2c 20 6f 70 65 72 61 74 69 6f 6e  ELETE, operation
17d60 20 69 73 20 6c 69 6b 65 20 42 54 53 5f 4f 56 45   is like BTS_OVE
17d70 52 57 52 49 54 45 20 77 69 74 68 20 74 68 65 20  RWRITE with the 
17d80 61 64 64 69 74 69 6f 6e 0a 2a 2a 20 74 68 61 74  addition.** that
17d90 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70   freelist leaf p
17da0 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
17db0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
17dc0 61 74 61 62 61 73 65 2c 20 69 6e 63 72 65 61 73  atabase, increas
17dd0 69 6e 67 0a 2a 2a 20 74 68 65 20 61 6d 6f 75 6e  ing.** the amoun
17de0 74 20 6f 66 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a  t of disk I/O..*
17df0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17e00 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42  eeSecureDelete(B
17e10 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77  tree *p, int new
17e20 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a  Flag){.  int b;.
17e30 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
17e40 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  urn 0;.  sqlite3
17e50 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
17e60 20 61 73 73 65 72 74 28 20 42 54 53 5f 4f 56 45   assert( BTS_OVE
17e70 52 57 52 49 54 45 3d 3d 42 54 53 5f 53 45 43 55  RWRITE==BTS_SECU
17e80 52 45 5f 44 45 4c 45 54 45 2a 32 20 29 3b 0a 20  RE_DELETE*2 );. 
17e90 20 61 73 73 65 72 74 28 20 42 54 53 5f 46 41 53   assert( BTS_FAS
17ea0 54 5f 53 45 43 55 52 45 3d 3d 28 42 54 53 5f 4f  T_SECURE==(BTS_O
17eb0 56 45 52 57 52 49 54 45 7c 42 54 53 5f 53 45 43  VERWRITE|BTS_SEC
17ec0 55 52 45 5f 44 45 4c 45 54 45 29 20 29 3b 0a 20  URE_DELETE) );. 
17ed0 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20   if( newFlag>=0 
17ee0 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62  ){.    p->pBt->b
17ef0 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
17f00 46 41 53 54 5f 53 45 43 55 52 45 3b 0a 20 20 20  FAST_SECURE;.   
17f10 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67   p->pBt->btsFlag
17f20 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
17f30 44 45 4c 45 54 45 2a 6e 65 77 46 6c 61 67 3b 0a  DELETE*newFlag;.
17f40 20 20 7d 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42    }.  b = (p->pB
17f50 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
17f60 53 5f 46 41 53 54 5f 53 45 43 55 52 45 29 2f 42  S_FAST_SECURE)/B
17f70 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
17f80 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17f90 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17fa0 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn b;.}../*.** C
17fb0 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
17fc0 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
17fd0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
17fe0 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
17ff0 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
18000 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
18010 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
18020 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
18030 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
18040 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
18050 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
18060 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
18070 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
18080 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
18090 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
180a0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
180b0 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
180c0 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
180d0 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
180e0 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
180f0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
18100 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
18110 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18120 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
18130 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
18140 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
18150 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18160 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61  .  u8 av = (u8)a
18170 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71  utoVacuum;..  sq
18180 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
18190 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e  p);.  if( (pBt->
181a0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
181b0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d  AGESIZE_FIXED)!=
181c0 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d  0 && (av ?1:0)!=
181d0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
181e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
181f0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
18200 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61  else{.    pBt->a
18210 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f  utoVacuum = av ?
18220 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  1:0;.    pBt->in
18230 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32  crVacuum = av==2
18240 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c   ?1:0;.  }.  sql
18250 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18260 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18270 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
18280 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
18290 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61   of the 'auto-va
182a0 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20  cuum' property. 
182b0 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69  If auto-vacuum i
182c0 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20  s .** enabled 1 
182d0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
182e0 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74  erwise 0..*/.int
182f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
18300 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
18310 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
18320 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
18330 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52  UUM.  return BTR
18340 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
18350 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  NE;.#else.  int 
18360 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
18370 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
18380 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42   = (.    (!p->pB
18390 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42  t->autoVacuum)?B
183a0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
183b0 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70  NONE:.    (!p->p
183c0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f  Bt->incrVacuum)?
183d0 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
183e0 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45  _FULL:.    BTREE
183f0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
18400 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  .  );.  sqlite3B
18410 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18420 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
18430 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  f.}../*.** If th
18440 65 20 75 73 65 72 20 68 61 73 20 6e 6f 74 20 73  e user has not s
18450 65 74 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65  et the safety-le
18460 76 65 6c 20 66 6f 72 20 74 68 69 73 20 64 61 74  vel for this dat
18470 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
18480 0a 2a 2a 20 75 73 69 6e 67 20 22 50 52 41 47 4d  .** using "PRAGM
18490 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20  A synchronous", 
184a0 61 6e 64 20 69 66 20 74 68 65 20 73 61 66 65 74  and if the safet
184b0 79 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20 61  y-level is not a
184c0 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 74 6f  lready.** set to
184d0 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   the value passe
184e0 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
184f0 6f 6e 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  on as the second
18500 20 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a 20 73   parameter,.** s
18510 65 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66  et it so..*/.#if
18520 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18530 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c  SYNCHRONOUS!=SQL
18540 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
18550 53 59 4e 43 48 52 4f 4e 4f 55 53 0a 73 74 61 74  SYNCHRONOUS.stat
18560 69 63 20 76 6f 69 64 20 73 65 74 44 65 66 61 75  ic void setDefau
18570 6c 74 53 79 6e 63 46 6c 61 67 28 42 74 53 68 61  ltSyncFlag(BtSha
18580 72 65 64 20 2a 70 42 74 2c 20 75 38 20 73 61 66  red *pBt, u8 saf
18590 65 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73 71  ety_level){.  sq
185a0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20  lite3 *db;.  Db 
185b0 2a 70 44 62 3b 0a 20 20 69 66 28 20 28 64 62 3d  *pDb;.  if( (db=
185c0 70 42 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28  pBt->db)!=0 && (
185d0 70 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20  pDb=db->aDb)!=0 
185e0 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44  ){.    while( pD
185f0 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62  b->pBt==0 || pDb
18600 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42 74 20  ->pBt->pBt!=pBt 
18610 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20  ){ pDb++; }.    
18620 69 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65  if( pDb->bSyncSe
18630 74 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 44  t==0 .     && pD
18640 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21  b->safety_level!
18650 3d 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a 20  =safety_level . 
18660 20 20 20 20 26 26 20 70 44 62 21 3d 26 64 62 2d      && pDb!=&db-
18670 3e 61 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b 0a  >aDb[1] .    ){.
18680 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74        pDb->safet
18690 79 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65 74 79  y_level = safety
186a0 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 73 71  _level;.      sq
186b0 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
186c0 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a  gs(pBt->pPager,.
186d0 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73            pDb->s
186e0 61 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64  afety_level | (d
186f0 62 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52  b->flags & PAGER
18700 5f 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20  _FLAGS_MASK));. 
18710 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
18720 0a 23 20 64 65 66 69 6e 65 20 73 65 74 44 65 66  .# define setDef
18730 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74  aultSyncFlag(pBt
18740 2c 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a 23  ,safety_level).#
18750 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  endif../*.** Get
18760 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
18770 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
18780 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
18790 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
187a0 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
187b0 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
187c0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
187d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
187e0 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
187f0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
18800 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
18810 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
18820 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18830 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
18840 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
18850 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
18860 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
18870 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
18880 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
18890 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
188a0 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
188b0 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
188c0 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
188d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
188e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
188f0 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  ult code from su
18900 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  bfunctions */.  
18910 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
18920 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f       /* Page 1 o
18930 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
18940 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
18950 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
18960 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
18970 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
18980 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46   */.  int nPageF
18990 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  ile = 0;   /* Nu
189a0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
189b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
189c0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
189d0 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20  eHeader;     /* 
189e0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
189f0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
18a00 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72  according to hdr
18a10 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
18a20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
18a30 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
18a40 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
18a50 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72  pPage1==0 );.  r
18a60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18a70 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e  SharedLock(pBt->
18a80 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
18a90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
18aa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
18ab0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
18ac0 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
18ad0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18ae0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
18af0 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
18b00 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
18b10 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
18b20 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
18b30 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
18b40 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
18b50 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65  e. .  */.  nPage
18b60 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d   = nPageHeader =
18b70 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
18b80 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
18b90 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
18ba0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
18bb0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c  Pager, &nPageFil
18bc0 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d  e);.  if( nPage=
18bd0 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b  =0 || memcmp(24+
18be0 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
18bf0 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67  ta, 92+(u8*)pPag
18c00 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20  e1->aData,4)!=0 
18c10 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  ){.    nPage = n
18c20 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20  PageFile;.  }.  
18c30 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
18c40 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b     u32 pageSize;
18c50 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53  .    u32 usableS
18c60 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67  ize;.    u8 *pag
18c70 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
18c80 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ta;.    rc = SQL
18c90 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
18ca0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
18cb0 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76  R-43737-39999 Ev
18cc0 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65  ery valid SQLite
18cd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
18ce0 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74  egins.    ** wit
18cf0 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
18d00 31 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78  16 bytes (in hex
18d10 29 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37  ): 53 51 4c 69 7
18d20 34 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32  4 65 20 66 6f 72
18d30 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34   6d.    ** 61 74
18d40 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20   20 33 00. */.  
18d50 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
18d60 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
18d70 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
18d80 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
18d90 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18da0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
18db0 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20  MIT_WAL.    if( 
18dc0 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
18dd0 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
18de0 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
18df0 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
18e00 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
18e10 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
18e20 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
18e30 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
18e40 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20  if( page1[18]>2 
18e50 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
18e60 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
18e70 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
18e80 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
18e90 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >2 ){.      goto
18ea0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
18eb0 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
18ec0 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76  * If the write v
18ed0 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f  ersion is set to
18ee0 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73   2, this databas
18ef0 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65  e should be acce
18f00 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57  ssed.    ** in W
18f10 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  AL mode. If the 
18f20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  log is not alrea
18f30 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74  dy open, open it
18f40 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20   now. Then .    
18f50 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
18f60 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77  _OK and return w
18f70 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e  ithout populatin
18f80 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65  g BtShared.pPage
18f90 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  1..    ** The ca
18fa0 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69  ller detects thi
18fb0 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73  s and calls this
18fc0 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e   function again.
18fd0 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20   This is.    ** 
18fe0 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20  required as the 
18ff0 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
19000 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  1 currently in t
19010 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a  he page1 buffer.
19020 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62      ** may not b
19030 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72  e the latest ver
19040 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79  sion - there may
19050 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20   be a newer one 
19060 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a  in the log.    *
19070 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  * file..    */. 
19080 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
19090 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73  ==2 && (pBt->bts
190a0 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57  Flags & BTS_NO_W
190b0 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AL)==0 ){.      
190c0 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  int isOpen = 0;.
190d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
190e0 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
190f0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f  Bt->pPager, &isO
19100 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pen);.      if( 
19110 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19120 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
19130 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19140 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19150 20 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74        setDefault
19160 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51  SyncFlag(pBt, SQ
19170 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
19180 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b  _SYNCHRONOUS+1);
19190 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
191a0 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
191b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
191c0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
191d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
191e0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
191f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
19200 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  = SQLITE_NOTADB;
19210 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19220 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63    setDefaultSync
19230 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45  Flag(pBt, SQLITE
19240 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f  _DEFAULT_SYNCHRO
19250 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23  NOUS+1);.    }.#
19260 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56  endif..    /* EV
19270 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34  IDENCE-OF: R-154
19280 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78  65-20813 The max
19290 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d  imum and minimum
192a0 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
192b0 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f  d.    ** fractio
192c0 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20  ns and the leaf 
192d0 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e  payload fraction
192e0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
192f0 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a  64, 32, and 32..
19300 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
19310 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
19320 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
19330 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
19340 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
19350 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
19360 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
19370 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
19380 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
19390 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
193a0 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
193b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
193c0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
193d0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
193e0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
193f0 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
19400 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
19410 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
19420 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
19430 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
19440 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
19450 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
19460 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
19470 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
19480 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
19490 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
194a0 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70     pageSize = (p
194b0 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  age1[16]<<8) | (
194c0 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a  page1[17]<<16);.
194d0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
194e0 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38  OF: R-25008-2168
194f0 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20  8 The size of a 
19500 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20  page is a power 
19510 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65  of two.    ** be
19520 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
19530 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a  536 inclusive. *
19540 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  /.    if( ((page
19550 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
19560 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67  )!=0.     || pag
19570 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
19580 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20  _PAGE_SIZE .    
19590 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35   || pageSize<=25
195a0 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  6 .    ){.      
195b0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
195c0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
195d0 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
195e0 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
195f0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19600 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35  F: R-59310-51205
19610 20 54 68 65 20 22 72 65 73 65 72 76 65 64 20 73   The "reserved s
19620 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68  pace" size in th
19630 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20  e 1-byte.    ** 
19640 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
19650 74 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62  t 20 is the numb
19660 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
19670 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
19680 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70  of.    ** each p
19690 61 67 65 20 74 6f 20 72 65 73 65 72 76 65 20 66  age to reserve f
196a0 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a  or extensions. .
196b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56      **.    ** EV
196c0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34  IDENCE-OF: R-374
196d0 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a  97-42412 The siz
196e0 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65  e of the reserve
196f0 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20  d region is.    
19700 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
19710 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
19720 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
19730 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
19740 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69  t of 20.    ** i
19750 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
19760 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f   file header. */
19770 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
19780 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
19790 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
197a0 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
197b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
197c0 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
197d0 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
197e0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
197f0 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
19800 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
19810 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
19820 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
19830 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
19840 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
19850 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
19860 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
19870 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
19880 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
19890 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
198a0 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
198b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
198c0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
198d0 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
198e0 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
198f0 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
19900 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
19910 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
19920 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
19930 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
19940 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
19950 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
19960 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
19970 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
19980 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
19990 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
199a0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
199b0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
199c0 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199f0 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
19a00 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
19a10 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
19a20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66   if( (pBt->db->f
19a30 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72  lags & SQLITE_Wr
19a40 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 20 26 26  iteSchema)==0 &&
19a50 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65   nPage>nPageFile
19a60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
19a70 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
19a80 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
19a90 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
19aa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
19ab0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
19ac0 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65  312-64704 Howeve
19ad0 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73 69  r, the usable si
19ae0 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ze is not allowe
19af0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c  d to.    ** be l
19b00 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e  ess than 480. In
19b10 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
19b20 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
19b30 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a  s 512, then the.
19b40 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20      ** reserved 
19b50 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f  space size canno
19b60 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a  t exceed 32. */.
19b70 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69      if( usableSi
19b80 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20  ze<480 ){.      
19b90 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
19ba0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
19bb0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
19bc0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
19bd0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
19be0 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69  = usableSize;.#i
19bf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19c00 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
19c10 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
19c20 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
19c30 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
19c40 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  :0);.    pBt->in
19c50 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
19c60 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
19c70 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
19c80 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61  dif.  }..  /* ma
19c90 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61  xLocal is the ma
19ca0 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
19cb0 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65  payload to store
19cc0 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a   locally for.  *
19cd0 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20  * a cell.  Make 
19ce0 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c  sure it is small
19cf0 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
19d00 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f  at least minFano
19d10 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61  ut.  ** cells ca
19d20 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e  n will fit on on
19d30 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75  e page.  We assu
19d40 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67  me a 10-byte pag
19d50 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42  e header..  ** B
19d60 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f  esides the paylo
19d70 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73  ad, the cell mus
19d80 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20  t store:.  **   
19d90 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72    2-byte pointer
19da0 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a   to the cell.  *
19db0 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69  *     4-byte chi
19dc0 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ld pointer.  ** 
19dd0 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20      9-byte nKey 
19de0 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
19df0 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75  -byte nData valu
19e00 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
19e10 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
19e20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20  pointer.  ** So 
19e30 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
19e40 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e  of a 2-byte poin
19e50 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68  ter, a header wh
19e60 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61  ich is as much a
19e70 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20  s.  ** 17 bytes 
19e80 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74  long, 0 to N byt
19e90 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61  es of payload, a
19ea0 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34  nd an optional 4
19eb0 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20   byte overflow. 
19ec0 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72   ** page pointer
19ed0 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61  ..  */.  pBt->ma
19ee0 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  xLocal = (u16)((
19ef0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
19f00 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29  12)*64/255 - 23)
19f10 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  ;.  pBt->minLoca
19f20 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  l = (u16)((pBt->
19f30 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
19f40 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70  2/255 - 23);.  p
19f50 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75  Bt->maxLeaf = (u
19f60 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
19f70 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74  ize - 35);.  pBt
19f80 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36  ->minLeaf = (u16
19f90 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
19fa0 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
19fb0 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  23);.  if( pBt->
19fc0 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a  maxLocal>127 ){.
19fd0 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74      pBt->max1byt
19fe0 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a  ePayload = 127;.
19ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
1a000 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
1a010 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78  d = (u8)pBt->max
1a020 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73  Local;.  }.  ass
1a030 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
1a040 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
1a050 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
1a060 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
1a070 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50  Page1;.  pBt->nP
1a080 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
1a090 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a0a0 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  ..page1_init_fai
1a0b0 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  led:.  releasePa
1a0c0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ge(pPage1);.  pB
1a0d0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
1a0e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1a0f0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
1a100 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1a110 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
1a120 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68   open on pBt. Th
1a130 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a  is is for use.**
1a140 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   in assert() exp
1a150 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20  ressions, so it 
1a160 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64  is only compiled
1a170 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
1a180 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  t.** defined..**
1a190 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
1a1a0 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
1a1b0 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20  ed if wrOnly is 
1a1c0 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79  true.  If wrOnly
1a1d0 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65   is.** false the
1a1e0 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  n all cursors ar
1a1f0 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  e counted..**.**
1a200 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
1a210 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
1a220 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61  e, a cursor is a
1a230 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a  ny cursor that.*
1a240 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20  * is capable of 
1a250 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1a260 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
1a270 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61  se.  Cursors tha
1a280 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74  t.** have been t
1a290 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20  ripped into the 
1a2a0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61  CURSOR_FAULT sta
1a2b0 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74  te are not count
1a2c0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1a2d0 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  t countValidCurs
1a2e0 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
1a2f0 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a  t, int wrOnly){.
1a300 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1a310 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
1a320 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
1a330 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
1a340 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
1a350 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79  .    if( (wrOnly
1a360 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75  ==0 || (pCur->cu
1a370 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
1a380 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20  iteFlag)!=0).   
1a390 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74    && pCur->eStat
1a3a0 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e!=CURSOR_FAULT 
1a3b0 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
1a3c0 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
1a3d0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
1a3e0 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
1a3f0 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
1a400 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
1a410 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
1a420 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
1a430 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
1a440 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1a450 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
1a460 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
1a470 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
1a480 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1a490 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
1a4a0 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
1a4b0 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
1a4c0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
1a4d0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
1a4e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
1a4f0 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
1a500 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1a510 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a520 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1a530 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
1a540 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
1a550 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1a560 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1a570 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74  .  assert( count
1a580 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
1a590 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69  ,0)==0 || pBt->i
1a5a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41  nTransaction>TRA
1a5b0 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28  NS_NONE );.  if(
1a5c0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1a5d0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
1a5e0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
1a5f0 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  0 ){.    MemPage
1a600 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
1a610 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65  pPage1;.    asse
1a620 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74  rt( pPage1->aDat
1a630 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
1a640 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
1a650 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1a660 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74  r)==1 );.    pBt
1a670 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
1a680 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
1a690 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b 0a 20 20  Null(pPage1);.  
1a6a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
1a6b0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
1a6c0 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
1a6d0 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
1a6e0 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
1a6f0 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
1a700 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
1a710 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
1a720 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
1a730 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1a740 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
1a750 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1a760 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
1a770 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1a780 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
1a790 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1a7a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1a7b0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1a7c0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
1a7d0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1a7e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1a7f0 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
1a800 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
1a810 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
1a820 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
1a830 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a840 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
1a850 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1a860 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
1a870 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
1a880 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
1a890 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
1a8a0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1a8b0 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
1a8c0 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
1a8d0 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
1a8e0 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
1a8f0 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
1a900 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
1a910 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
1a920 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
1a930 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
1a940 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
1a950 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
1a960 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
1a970 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
1a980 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
1a990 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
1a9a0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
1a9b0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1a9c0 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
1a9d0 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
1a9e0 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
1a9f0 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
1aa00 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
1aa10 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
1aa20 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
1aa30 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
1aa40 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
1aa50 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1aa60 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
1aa70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1aa80 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1aa90 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
1aaa0 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
1aab0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
1aac0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1aad0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
1aae0 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
1aaf0 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
1ab00 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
1ab10 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
1ab20 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
1ab30 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
1ab40 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
1ab50 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
1ab60 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
1ab70 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
1ab80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ab90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
1aba0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
1abb0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1abc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
1abd0 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
1abe0 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
1abf0 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
1ac00 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
1ac10 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
1ac20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
1ac30 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
1ac40 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1ac50 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1ac60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1ac70 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
1ac80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1ac90 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1aca0 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
1acb0 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
1acc0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
1acd0 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
1ace0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1acf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ad00 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
1ad10 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
1ad20 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
1ad30 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
1ad40 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
1ad50 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1ad60 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
1ad70 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
1ad80 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
1ad90 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1ada0 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
1adb0 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
1adc0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1add0 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
1ade0 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
1adf0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
1ae00 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
1ae10 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
1ae20 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
1ae30 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
1ae40 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
1ae50 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
1ae60 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
1ae70 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
1ae80 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
1ae90 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
1aea0 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
1aeb0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
1aec0 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
1aed0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1aee0 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
1aef0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
1af00 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
1af10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1af20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
1af30 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
1af40 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
1af50 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
1af60 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
1af70 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
1af80 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1af90 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
1afa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1afb0 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
1afc0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1afd0 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
1afe0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1aff0 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
1b000 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b010 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
1b020 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
1b030 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
1b040 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
1b050 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
1b060 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
1b070 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
1b080 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
1b090 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
1b0a0 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
1b0b0 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
1b0c0 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
1b0d0 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
1b0e0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1b0f0 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
1b100 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
1b110 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
1b120 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
1b130 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
1b140 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1b150 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
1b160 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
1b170 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
1b180 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
1b190 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1b1a0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
1b1b0 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
1b1c0 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
1b1d0 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
1b1e0 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1b1f0 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
1b200 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
1b210 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
1b220 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
1b230 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1b240 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
1b250 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
1b260 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
1b270 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
1b280 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
1b290 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
1b2a0 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
1b2b0 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
1b2c0 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
1b2d0 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
1b2e0 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
1b2f0 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
1b300 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
1b310 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
1b320 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
1b330 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
1b340 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
1b350 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
1b360 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
1b370 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
1b380 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
1b390 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1b3a0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
1b3b0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
1b3c0 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72  rflag){.  BtShar
1b3d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1b3e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1b3f0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74  ITE_OK;..  sqlit
1b400 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1b410 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1b420 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
1b430 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65  he btree is alre
1b440 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74  ady in a write-t
1b450 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69  ransaction, or i
1b460 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64  t.  ** is alread
1b470 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  y in a read-tran
1b480 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65  saction and a re
1b490 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  ad-transaction. 
1b4a0 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64   ** is requested
1b4b0 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
1b4c0 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  p..  */.  if( p-
1b4d0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1b4e0 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54  WRITE || (p->inT
1b4f0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44  rans==TRANS_READ
1b500 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a   && !wrflag) ){.
1b510 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1b520 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  egun;.  }.  asse
1b530 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1b540 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1b550 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74  ITE || IfNotOmit
1b560 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
1b570 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  ate)==0 );..  /*
1b580 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   Write transacti
1b590 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73  ons are not poss
1b5a0 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f  ible on a read-o
1b5b0 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nly database */.
1b5c0 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
1b5d0 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
1b5e0 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66 6c  ONLY)!=0 && wrfl
1b5f0 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
1b600 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1b610 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1b620 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  egun;.  }..#ifnd
1b630 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1b640 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 7b 0a  HARED_CACHE.  {.
1b650 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c      sqlite3 *pBl
1b660 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20  ock = 0;.    /* 
1b670 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
1b680 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
1b690 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
1b6a0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1b6b0 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 69  n .    ** on thi
1b6c0 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
1b6d0 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
1b6e0 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
1b6f0 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 2a  saction is.    *
1b700 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74  * requested, ret
1b710 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
1b720 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  D..    */.    if
1b730 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74  ( (wrflag && pBt
1b740 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1b750 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20  =TRANS_WRITE).  
1b760 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46     || (pBt->btsF
1b770 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
1b780 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20  NG)!=0.    ){.  
1b790 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74      pBlock = pBt
1b7a0 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20  ->pWriter->db;. 
1b7b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66     }else if( wrf
1b7c0 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 42  lag>1 ){.      B
1b7d0 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
1b7e0 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42      for(pIter=pB
1b7f0 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
1b800 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
1b810 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
1b820 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
1b830 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =p ){.          
1b840 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e  pBlock = pIter->
1b850 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
1b860 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b880 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 6c     }.    if( pBl
1b890 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ock ){.      sql
1b8a0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
1b8b0 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c  ocked(p->db, pBl
1b8c0 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ock);.      rc =
1b8d0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
1b8e0 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20  HAREDCACHE;.    
1b8f0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
1b900 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  un;.    }.  }.#e
1b910 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72  ndif..  /* Any r
1b920 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64  ead-only or read
1b930 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69  -write transacti
1b940 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61  on implies a rea
1b950 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20  d-lock on .  ** 
1b960 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f  page 1. So if so
1b970 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d  me other shared-
1b980 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72  cache client alr
1b990 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65  eady has a write
1b9a0 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70  -lock .  ** on p
1b9b0 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73  age 1, the trans
1b9c0 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  action cannot be
1b9d0 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63   opened. */.  rc
1b9e0 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
1b9f0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
1ba00 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
1ba10 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53  D_LOCK);.  if( S
1ba20 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67  QLITE_OK!=rc ) g
1ba30 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1ba40 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ..  pBt->btsFlag
1ba50 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41  s &= ~BTS_INITIA
1ba60 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28  LLY_EMPTY;.  if(
1ba70 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29   pBt->nPage==0 )
1ba80 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1ba90 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  = BTS_INITIALLY_
1baa0 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20  EMPTY;.  do {.  
1bab0 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74    /* Call lockBt
1bac0 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68  ree() until eith
1bad0 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69  er pBt->pPage1 i
1bae0 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20  s populated or. 
1baf0 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28     ** lockBtree(
1bb00 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68  ) returns someth
1bb10 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ing other than S
1bb20 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74  QLITE_OK. lockBt
1bb30 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ree().    ** may
1bb40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bb50 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d  K but leave pBt-
1bb60 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30  >pPage1 set to 0
1bb70 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a   if after.    **
1bb80 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20   reading page 1 
1bb90 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  it discovers tha
1bba0 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
1bbb0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1bbc0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  .    ** file is 
1bbd0 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  not pBt->pageSiz
1bbe0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
1bbf0 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c  lockBtree() will
1bc00 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70   update.    ** p
1bc10 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20  Bt->pageSize to 
1bc20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
1bc30 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
1bc40 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68  k..    */.    wh
1bc50 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
1bc60 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
1bc70 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65  ==(rc = lockBtre
1bc80 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20  e(pBt)) );..    
1bc90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bca0 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
1bcb0 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62       if( (pBt->b
1bcc0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1bcd0 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20  AD_ONLY)!=0 ){. 
1bce0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1bcf0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
1bd00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bd10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1bd20 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  gerBegin(pBt->pP
1bd30 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71  ager,wrflag>1,sq
1bd40 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
1bd50 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  y(p->db));.     
1bd60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1bd70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1bd80 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
1bd90 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
1bda0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1bdb0 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d  .  .    if( rc!=
1bdc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bdd0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1bde0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
1bdf0 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63   }.  }while( (rc
1be00 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42  &0xFF)==SQLITE_B
1be10 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
1be20 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1be30 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
1be40 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75     btreeInvokeBu
1be50 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29  syHandler(pBt) )
1be60 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
1be70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1be80 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1be90 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
1bea0 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
1beb0 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53  ion++;.#ifndef S
1bec0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1bed0 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66  D_CACHE.      if
1bee0 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
1bef0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1bf00 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d   p->lock.pBtree=
1bf10 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54  =p && p->lock.iT
1bf20 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
1bf30 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b     p->lock.eLock
1bf40 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
1bf50 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e        p->lock.pN
1bf60 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
1bf70 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70  ;.        pBt->p
1bf80 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b  Lock = &p->lock;
1bf90 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1bfa0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
1bfb0 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
1bfc0 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
1bfd0 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
1bfe0 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
1bff0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
1c000 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
1c010 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
1c020 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  nTrans;.    }.  
1c030 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
1c040 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1c050 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
1c060 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge1;.#ifndef SQL
1c070 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1c080 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65  CACHE.      asse
1c090 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65  rt( !pBt->pWrite
1c0a0 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r );.      pBt->
1c0b0 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20  pWriter = p;.   
1c0c0 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
1c0d0 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49   &= ~BTS_EXCLUSI
1c0e0 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72  VE;.      if( wr
1c0f0 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74  flag>1 ) pBt->bt
1c100 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58  sFlags |= BTS_EX
1c110 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a  CLUSIVE;.#endif.
1c120 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1c130 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20   db-size header 
1c140 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65  field is incorre
1c150 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ct (as it may be
1c160 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20   if an old.     
1c170 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62   ** client has b
1c180 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  een writing the 
1c190 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
1c1a0 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44  update it now. D
1c1b0 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  oing.      ** th
1c1c0 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  is sooner rather
1c1d0 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e   than later mean
1c1e0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  s the database s
1c1f0 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a  ize can safely .
1c200 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64        ** re-read
1c210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1c220 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69  ze from page 1 i
1c230 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72  f a savepoint or
1c240 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
1c250 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f     ** rollback o
1c260 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
1c270 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
1c280 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1c290 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74   pBt->nPage!=get
1c2a0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1c2b0 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20  Data[28]) ){.   
1c2c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c2d0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1c2e0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1c2f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1c300 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c310 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1c320 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1c330 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
1c340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c350 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61  .    }.  }...tra
1c360 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20  ns_begun:.  if( 
1c370 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c380 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f   wrflag ){.    /
1c390 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65  * This call make
1c3a0 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  s sure that the 
1c3b0 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f  pager has the co
1c3c0 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a  rrect number of.
1c3d0 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65      ** open save
1c3e0 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73  points. If the s
1c3f0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
1c400 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1c410 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65  0 and.    ** the
1c420 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
1c430 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
1c440 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62  , then it will b
1c450 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20  e opened here.. 
1c460 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
1c470 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
1c480 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1c490 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61  ager, p->db->nSa
1c4a0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20  vepoint);.  }.. 
1c4b0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1c4c0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
1c4d0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1c4e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
1c4f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c500 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
1c510 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
1c520 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
1c530 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
1c540 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
1c550 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
1c560 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
1c570 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
1c580 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
1c590 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
1c5a0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1c5b0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
1c5c0 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
1c5d0 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
1c5e0 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
1c5f0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
1c600 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1c610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c620 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
1c630 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
1c640 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1c650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c660 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
1c670 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
1c680 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6a0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1c6b0 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
1c6c0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
1c6d0 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
1c6e0 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   = pPage->pgno;.
1c6f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1c700 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
1c710 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
1c720 20 29 3b 0a 20 20 72 63 20 3d 20 70 50 61 67 65   );.  rc = pPage
1c730 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54  ->isInit ? SQLIT
1c740 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74  E_OK : btreeInit
1c750 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69  Page(pPage);.  i
1c760 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c770 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1c780 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
1c790 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
1c7a0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
1c7b0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
1c7c0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1c7d0 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70   i);..    ptrmap
1c7e0 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
1c7f0 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a  , pCell, &rc);..
1c800 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1c810 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
1c820 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
1c830 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
1c840 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1c850 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
1c860 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
1c870 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  no, &rc);.    }.
1c880 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
1c890 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  e->leaf ){.    P
1c8a0 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
1c8b0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1c8c0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1c8d0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1c8e0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1c8f0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
1c900 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
1c910 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rc);.  }..  retu
1c920 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c930 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
1c940 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ge is a pointer 
1c950 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20  to page iFrom.  
1c960 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
1c970 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ter so.** that i
1c980 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e  t points to iTo.
1c990 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
1c9a0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
1c9b0 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
1c9c0 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64  o.** be modified
1c9d0 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  , as  follows:.*
1c9e0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
1c9f0 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
1ca00 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
1ca10 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1ca20 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca40 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
1ca50 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
1ca60 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
1ca70 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
1ca80 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1ca90 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
1caa0 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
1cab0 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
1cac0 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
1cad0 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
1cae0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
1caf0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
1cb00 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
1cb10 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
1cb20 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
1cb30 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
1cb40 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
1cb50 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1cb60 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
1cb70 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
1cb80 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
1cb90 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
1cba0 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
1cbb0 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
1cbc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1cbd0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1cbe0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1cbf0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
1cc00 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
1cc10 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
1cc20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1cc30 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
1cc40 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
1cc50 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
1cc60 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
1cc70 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
1cc80 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
1cc90 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
1cca0 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
1ccb0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
1ccc0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1ccd0 50 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70  PT_PGNO(pPage->p
1cce0 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  gno);.    }.    
1ccf0 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
1cd00 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
1cd10 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b  else{.    int i;
1cd20 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
1cd30 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
1cd40 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49   rc = pPage->isI
1cd50 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  nit ? SQLITE_OK 
1cd60 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  : btreeInitPage(
1cd70 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
1cd80 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1cd90 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67      nCell = pPag
1cda0 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66  e->nCell;..    f
1cdb0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1cdc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20   i++){.      u8 
1cdd0 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
1cde0 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20  l(pPage, i);.   
1cdf0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1ce00 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
1ce10 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e  {.        CellIn
1ce20 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20  fo info;.       
1ce30 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
1ce40 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
1ce50 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
1ce60 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c   if( info.nLocal
1ce70 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  <info.nPayload )
1ce80 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1ce90 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
1cea0 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b   > pPage->aData+
1ceb0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
1cec0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
1ced0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1cee0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
1cef0 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20  (pPage->pgno);. 
1cf00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1cf10 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d       if( iFrom==
1cf20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69  get4byte(pCell+i
1cf30 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a  nfo.nSize-4) ){.
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
1cf50 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e  byte(pCell+info.
1cf60 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20  nSize-4, iTo);. 
1cf70 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1cf80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1cf90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1cfa0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
1cfb0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
1cfc0 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
1cfd0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
1cfe0 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
1cff0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d000 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1d010 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
1d020 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
1d030 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
1d040 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
1d050 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
1d060 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1d070 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1d080 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
1d090 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d0a0 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
1d0b0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
1d0c0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
1d0d0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1d0e0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1d0f0 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
1d100 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1d110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
1d120 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
1d130 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
1d140 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
1d150 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
1d160 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
1d170 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
1d180 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
1d190 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20  ns valid..**.** 
1d1a0 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  The isCommit fla
1d1b0 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  g indicates that
1d1c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
1d1d0 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
1d1e0 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  at.** the journa
1d1f0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
1d200 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61  nc()ed before da
1d210 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1d220 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61  age->pgno .** ca
1d230 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e  n be written to.
1d240 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   The caller has 
1d250 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64  already promised
1d260 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f   not to write to
1d270 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a   that.** page..*
1d280 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
1d290 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
1d2a0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
1d2b0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
1d2c0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
1d2d0 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
1d2e0 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
1d2f0 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d310 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1d320 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
1d330 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1d340 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
1d350 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1d360 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
1d370 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1d380 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
1d390 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
1d3a0 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
1d3b0 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
1d3c0 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  o */.  int isCom
1d3d0 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
1d3e0 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  /* isCommit flag
1d3f0 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
1d400 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20  e3PagerMovepage 
1d410 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
1d420 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20  *pPtrPage;   /* 
1d430 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
1d440 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
1d450 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20   to pDbPage */. 
1d460 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20   Pgno iDbPage = 
1d470 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  pDbPage->pgno;. 
1d480 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1d490 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
1d4a0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1d4b0 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  t( eType==PTRMAP
1d4c0 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54  _OVERFLOW2 || eT
1d4d0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1d4e0 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20  FLOW1 || .      
1d4f0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
1d500 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
1d510 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
1d520 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1d530 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1d540 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1d550 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e  ssert( pDbPage->
1d560 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f  pBt==pBt );..  /
1d570 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50  * Move page iDbP
1d580 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72  age from its cur
1d590 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f  rent location to
1d5a0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72   page number iFr
1d5b0 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43  eePage */.  TRAC
1d5c0 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20  E(("AUTOVACUUM: 
1d5d0 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65  Moving %d to fre
1d5e0 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70  e page %d (ptr p
1d5f0 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c  age %d type %d)\
1d600 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61  n", .      iDbPa
1d610 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1d620 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29  PtrPage, eType))
1d630 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1d640 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50  PagerMovepage(pP
1d650 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70  ager, pDbPage->p
1d660 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1d670 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20  e, isCommit);.  
1d680 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d690 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d6a0 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
1d6b0 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
1d6c0 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
1d6d0 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
1d6e0 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
1d6f0 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
1d700 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
1d710 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
1d720 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1d730 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
1d740 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
1d750 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
1d760 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
1d770 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
1d780 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
1d790 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
1d7a0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
1d7b0 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
1d7c0 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
1d7d0 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
1d7e0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1d7f0 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
1d800 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
1d810 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
1d820 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
1d830 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
1d840 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
1d850 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
1d860 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1d870 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
1d880 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1d890 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
1d8a0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
1d8b0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1d8c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d8d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d8e0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1d8f0 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
1d900 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
1d910 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
1d920 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
1d930 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  0 ){.      ptrma
1d940 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
1d950 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
1d960 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c  LOW2, iFreePage,
1d970 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
1d980 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d990 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1d9a0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1d9b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
1d9c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
1d9d0 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
1d9e0 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
1d9f0 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
1da00 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
1da10 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
1da20 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
1da30 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
1da40 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
1da50 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
1da60 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
1da70 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
1da80 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1da90 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20  (pBt, iPtrPage, 
1daa0 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20  &pPtrPage, 0);. 
1dab0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1dac0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1dad0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1dae0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1daf0 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61  agerWrite(pPtrPa
1db00 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
1db10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1db20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
1db30 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
1db40 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1db50 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1db60 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  c = modifyPagePo
1db70 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20  inter(pPtrPage, 
1db80 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
1db90 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20  ge, eType);.    
1dba0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
1dbb0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1dbc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1dbd0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1dbe0 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
1dbf0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1dc00 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1dc10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1dc20 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
1dc30 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  aration required
1dc40 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74   by incrVacuumSt
1dc50 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ep(). */.static 
1dc60 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
1dc70 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
1dc80 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
1dc90 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
1dca0 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  ../*.** Perform 
1dcb0 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
1dcc0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
1dcd0 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65  vacuum. If succe
1dce0 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a  ssful, return.**
1dcf0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
1dd00 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20  here is no work 
1dd10 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65  to do (and there
1dd20 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  fore no point in
1dd30 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69   .** calling thi
1dd40 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
1dd50 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
1dd60 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e  _DONE. Or, if an
1dd70 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
1dd80 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f  s, return some o
1dd90 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e  ther error code.
1dda0 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
1ddb0 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66  ifically, this f
1ddc0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
1ddd0 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20   to re-organize 
1dde0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20  the database so 
1ddf0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73  .** that the las
1de00 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  t page of the fi
1de10 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  le currently in 
1de20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  use is no longer
1de30 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50   in use..**.** P
1de40 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73  arameter nFin is
1de50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1de60 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64  ages that this d
1de70 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f  atabase would co
1de80 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68  ntain.** were th
1de90 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  is function call
1dea0 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  ed until it retu
1deb0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  rns SQLITE_DONE.
1dec0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43  .**.** If the bC
1ded0 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20  ommit parameter 
1dee0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69  is non-zero, thi
1def0 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
1df00 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  es that the .** 
1df10 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
1df20 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
1df30 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20  uumStep() until 
1df40 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
1df50 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e  E_DONE .** or an
1df60 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20   error. bCommit 
1df70 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66  is passed true f
1df80 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
1df90 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20  m-on-commit .** 
1dfa0 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61  operation, or fa
1dfb0 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65  lse for an incre
1dfc0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
1dfd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
1dfe0 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68  rVacuumStep(BtSh
1dff0 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
1e000 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74  nFin, Pgno iLast
1e010 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  Pg, int bCommit)
1e020 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
1e030 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
1e040 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1e050 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
1e060 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ee-list */.  int
1e070 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1e080 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1e090 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1e0a0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73  ;.  assert( iLas
1e0b0 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69  tPg>nFin );..  i
1e0c0 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
1e0d0 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
1e0e0 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
1e0f0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1e100 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79  t) ){.    u8 eTy
1e110 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
1e120 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65  rPage;..    nFre
1e130 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65  eList = get4byte
1e140 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1e150 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69  Data[36]);.    i
1e160 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
1e170 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e180 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1e190 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
1e1a0 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
1e1b0 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
1e1c0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
1e1d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e1e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1e1f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
1e200 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1e210 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
1e220 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1e230 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1e240 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
1e250 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
1e260 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
1e270 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1e280 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
1e290 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
1e2a0 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73  e files free-lis
1e2b0 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  t. This is not r
1e2c0 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20  equired.        
1e2d0 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  ** if bCommit is
1e2e0 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
1e2f0 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65  at case, the fre
1e300 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20  e-list will be. 
1e310 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61         ** trunca
1e320 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65  ted to zero afte
1e330 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1e340 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64  returns, so it d
1e350 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20  oesn't .        
1e360 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20  ** matter if it 
1e370 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73  still contains s
1e380 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72  ome garbage entr
1e390 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ies..        */.
1e3a0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
1e3b0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65  eePg;.        Me
1e3c0 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1e3d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1e3e0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1e3f0 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1e400 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c  FreePg, iLastPg,
1e410 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b   BTALLOC_EXACT);
1e420 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1e430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e440 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1e450 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1e460 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
1e470 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
1e480 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
1e490 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
1e4a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
1e4b0 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
1e4c0 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
1e4d0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1e4e0 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
1e4f0 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
1e500 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1e510 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38  LastPg;.      u8
1e520 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1e530 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20  _ANY;   /* Mode 
1e540 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1e550 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1e560 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20  ) */.      Pgno 
1e570 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20  iNear = 0;      
1e580 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70       /* nearby p
1e590 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
1e5a0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
1e5b0 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   */..      rc = 
1e5c0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1e5d0 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
1e5e0 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
1e5f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e600 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1e610 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
1e620 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d        /* If bCom
1e630 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69  mit is zero, thi
1e640 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63  s loop runs exac
1e650 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67  tly once and pag
1e660 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20  e pLastPg.      
1e670 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69  ** is swapped wi
1e680 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65  th the first fre
1e690 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66  e page pulled of
1e6a0 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  f the free list.
1e6b0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1e6c0 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
1e6d0 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74  hand, if bCommit
1e6e0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1e6f0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70   zero, then keep
1e700 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e  .      ** loopin
1e710 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70  g until a free-p
1e720 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68  age located with
1e730 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69  in the first nFi
1e740 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  n pages.      **
1e750 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1e760 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  found..      */.
1e770 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
1e780 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1e790 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
1e7a0 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61  LE;.        iNea
1e7b0 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20  r = nFin;.      
1e7c0 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  }.      do {.   
1e7d0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
1e7e0 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
1e7f0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
1e800 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
1e810 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
1e820 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20  Near, eMode);.  
1e830 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e840 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e850 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1e860 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
1e870 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e880 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e890 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1e8a0 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
1e8b0 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26  hile( bCommit &&
1e8c0 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
1e8d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1e8e0 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
1e8f0 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
1e900 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
1e910 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65  (pBt, pLastPg, e
1e920 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
1e930 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74  iFreePg, bCommit
1e940 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
1e950 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
1e960 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e970 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1e990 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1e9a0 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1e9b0 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   ){.    do {.   
1e9c0 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20     iLastPg--;.  
1e9d0 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50    }while( iLastP
1e9e0 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
1e9f0 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52  PAGE(pBt) || PTR
1ea00 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1ea10 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20  iLastPg) );.    
1ea20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1ea30 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e   = 1;.    pBt->n
1ea40 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a  Page = iLastPg;.
1ea50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1ea60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1ea70 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   The database op
1ea80 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73  ened by the firs
1ea90 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  t argument is an
1eaa0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1eab0 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70  abase.** nOrig p
1eac0 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ages in size con
1ead0 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72  taining nFree fr
1eae0 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ee pages. Return
1eaf0 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
1eb00 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * size of the da
1eb10 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20  tabase in pages 
1eb20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74  following an aut
1eb30 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69  o-vacuum operati
1eb40 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  on..*/.static Pg
1eb50 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42  no finalDbSize(B
1eb60 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
1eb70 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e  no nOrig, Pgno n
1eb80 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e  Free){.  int nEn
1eb90 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  try;            
1eba0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ebb0 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e  er of entries on
1ebc0 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65   one ptrmap page
1ebd0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d   */.  Pgno nPtrm
1ebe0 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
1ebf0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1ec00 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20  of PtrMap pages 
1ec10 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
1ec20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
1ec50 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20   */..  nEntry = 
1ec60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
1ec70 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  5;.  nPtrmap = (
1ec80 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
1ec90 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
1eca0 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45  Orig)+nEntry)/nE
1ecb0 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e  ntry;.  nFin = n
1ecc0 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e  Orig - nFree - n
1ecd0 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f  Ptrmap;.  if( nO
1ece0 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  rig>PENDING_BYTE
1ecf0 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
1ed00 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  in<PENDING_BYTE_
1ed10 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1ed20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77   nFin--;.  }.  w
1ed30 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
1ed40 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c  AGE(pBt, nFin) |
1ed50 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f  | nFin==PENDING_
1ed60 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1ed70 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
1ed80 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e  }..  return nFin
1ed90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
1eda0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
1edb0 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
1edc0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
1edd0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
1ede0 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
1edf0 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
1ee00 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
1ee10 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1ee20 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
1ee30 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
1ee40 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
1ee50 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1ee60 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
1ee70 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
1ee80 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
1ee90 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
1eea0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
1eeb0 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
1eec0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
1eed0 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
1eee0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
1eef0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ef00 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
1ef10 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1ef20 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1ef30 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
1ef40 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1ef50 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
1ef60 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1ef70 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
1ef80 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1ef90 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
1efa0 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
1efb0 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
1efc0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
1efd0 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  lse{.    Pgno nO
1efe0 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
1eff0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50  ount(pBt);.    P
1f000 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34  gno nFree = get4
1f010 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1f020 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1f030 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66     Pgno nFin = f
1f040 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
1f050 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a  nOrig, nFree);..
1f060 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46      if( nOrig<nF
1f070 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  in ){.      rc =
1f080 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1f090 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  BKPT;.    }else 
1f0a0 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20  if( nFree>0 ){. 
1f0b0 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
1f0c0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
1f0d0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1f0e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f0f0 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61          invalida
1f100 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
1f110 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  he(pBt);.       
1f120 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
1f130 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
1f140 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20  nOrig, 0);.     
1f150 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
1f160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f170 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f180 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
1f190 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
1f1a0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  e);.        put4
1f1b0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1f1c0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
1f1d0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
1f1e0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1f1f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1f200 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
1f210 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1f220 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1f230 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1f240 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1f250 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
1f260 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1f270 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
1f280 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
1f290 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  ted for an auto-
1f2a0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e  vacuum database.
1f2b0 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1f2c0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1f2d0 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69   then *pnTrunc i
1f2e0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
1f2f0 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
1f300 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f310 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  e should be trun
1f320 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20  cated to during 
1f330 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
1f340 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65  ss. .** i.e. the
1f350 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
1f360 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73  en reorganized s
1f370 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20  o that only the 
1f380 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a  first *pnTrunc.*
1f390 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  * pages are in u
1f3a0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1f3b0 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  t autoVacuumComm
1f3c0 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  it(BtShared *pBt
1f3d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1f3e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1f3f0 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
1f400 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e  pPager;.  VVA_ON
1f410 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  LY( int nRef = s
1f420 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1f430 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a 0a  unt(pPager); )..
1f440 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f450 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1f460 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e  ->mutex) );.  in
1f470 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
1f480 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
1f490 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74   assert(pBt->aut
1f4a0 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20  oVacuum);.  if( 
1f4b0 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  !pBt->incrVacuum
1f4c0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69   ){.    Pgno nFi
1f4d0 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
1f4e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1f4f0 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
1f500 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f  autovacuuming */
1f510 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b  .    Pgno nFree;
1f520 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f530 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
1f540 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69  e freelist initi
1f550 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ally */.    Pgno
1f560 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   iFree;        /
1f570 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20  * The next page 
1f580 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
1f590 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20     Pgno nOrig;  
1f5a0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1f5b0 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72  e size before fr
1f5c0 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f  eeing */..    nO
1f5d0 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
1f5e0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69  ount(pBt);.    i
1f5f0 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
1f600 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20  (pBt, nOrig) || 
1f610 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
1f620 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1f630 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
1f640 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
1f650 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
1f660 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  e for which the 
1f670 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20  final page.     
1f680 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20   ** is either a 
1f690 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1f6a0 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   or the pending-
1f6b0 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e  byte page. If on
1f6c0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e  e.      ** is en
1f6d0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20  countered, this 
1f6e0 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70  indicates corrup
1f6f0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1f700 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f710 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1f720 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65  .    }..    nFre
1f730 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
1f740 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1f750 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20  [36]);.    nFin 
1f760 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42  = finalDbSize(pB
1f770 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29  t, nOrig, nFree)
1f780 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e  ;.    if( nFin>n
1f790 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51  Orig ) return SQ
1f7a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f7b0 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c  T;.    if( nFin<
1f7c0 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
1f7d0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
1f7e0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1f7f0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72     }.    for(iFr
1f800 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e  ee=nOrig; iFree>
1f810 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  nFin && rc==SQLI
1f820 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b  TE_OK; iFree--){
1f830 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
1f840 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
1f850 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b  nFin, iFree, 1);
1f860 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1f870 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1f880 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
1f890 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a  ) && nFree>0 ){.
1f8a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f8b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
1f8c0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
1f8d0 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
1f8e0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1f8f0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
1f900 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1f910 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1f920 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
1f930 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1f940 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
1f950 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20  8], nFin);.     
1f960 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1f970 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74  e = 1;.      pBt
1f980 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a  ->nPage = nFin;.
1f990 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1f9a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f9b0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1f9c0 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
1f9d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1f9e0 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71  assert( nRef>=sq
1f9f0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
1fa00 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
1fa10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
1fa20 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  lse /* ifndef SQ
1fa30 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1fa40 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65  CUUM */.# define
1fa50 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1fa60 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
1fa70 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1fa80 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
1fa90 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66  e first phase of
1faa0 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
1fab0 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  mit.  This routi
1fac0 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72  ne.** causes a r
1fad0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1fae0 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69  to be created (i
1faf0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
1fb00 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20  ready exist).** 
1fb10 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
1fb20 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d  th enough inform
1fb30 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66  ation so that if
1fb40 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63   a power loss oc
1fb50 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  curs.** the data
1fb60 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74  base can be rest
1fb70 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
1fb80 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c  inal state by pl
1fb90 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68  aying back.** th
1fba0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e  e journal.  Then
1fbb0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1fbc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65   the journal are
1fbd0 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a   flushed out to.
1fbe0 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66  ** the disk.  Af
1fbf0 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
1fc00 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69  is safely on oxi
1fc10 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20  de, the changes 
1fc20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
1fc30 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  se are written i
1fc40 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
1fc50 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65   file and flushe
1fc60 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41  d to oxide..** A
1fc70 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69  t the end of thi
1fc80 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c  s call, the roll
1fc90 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69  back journal sti
1fca0 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  ll exists on the
1fcb0 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20  .** disk and we 
1fcc0 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e  are still holdin
1fcd0 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20  g all locks, so 
1fce0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1fcf0 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69  has not.** commi
1fd00 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74  tted.  See sqlit
1fd10 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1fd20 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20  seTwo() for the 
1fd30 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
1fd40 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
1fd50 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
1fd60 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
1fd70 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
1fd80 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
1fd90 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
1fda0 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
1fdb0 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
1fdc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
1fdd0 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
1fde0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
1fdf0 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
1fe00 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1fe10 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
1fe20 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
1fe30 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
1fe40 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
1fe50 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
1fe60 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
1fe70 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1fe80 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
1fe90 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1fea0 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
1feb0 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
1fec0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1fed0 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
1fee0 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
1fef0 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
1ff00 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
1ff10 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
1ff20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
1ff30 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
1ff40 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
1ff50 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
1ff60 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
1ff70 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
1ff80 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
1ff90 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
1ffa0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
1ffb0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1ffc0 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
1ffd0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1ffe0 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
1fff0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
20000 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
20010 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
20020 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
20030 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
20040 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20050 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  = p->pBt;.    sq
20060 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
20070 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p);.#ifndef SQLI
20080 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
20090 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
200a0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
200b0 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
200c0 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  uumCommit(pBt);.
200d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
200e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
200f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
20100 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
20110 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20120 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
20130 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  ( pBt->bDoTrunca
20140 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  te ){.      sqli
20150 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
20160 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  Image(pBt->pPage
20170 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  r, pBt->nPage);.
20180 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
20190 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
201a0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
201b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d  (pBt->pPager, zM
201c0 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73  aster, 0);.    s
201d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
201e0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
201f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
20200 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
20210 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68  called from both
20220 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
20230 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65  eTwo() and Btree
20240 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74  Rollback().** at
20250 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
20260 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
20270 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
20280 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
20290 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a  tion(Btree *p){.
202a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
202b0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
202c0 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
202d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
202e0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
202f0 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66  x(p) );..#ifndef
20300 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
20310 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62  OVACUUM.  pBt->b
20320 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a  DoTruncate = 0;.
20330 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
20340 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f  inTrans>TRANS_NO
20350 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52  NE && db->nVdbeR
20360 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  ead>1 ){.    /* 
20370 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  If there are oth
20380 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  er active statem
20390 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  ents that belong
203a0 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
203b0 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c  e.    ** handle,
203c0 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20   downgrade to a 
203d0 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
203e0 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72  ction. The other
203f0 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20   statements.    
20400 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ** may still be 
20410 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
20420 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20   database.  */. 
20430 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53     downgradeAllS
20440 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
20450 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e  ocks(p);.    p->
20460 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
20470 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
20480 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e     /* If the han
20490 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64  dle had any kind
204a0 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   of transaction 
204b0 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20  open, decrement 
204c0 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  the .    ** tran
204d0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66  saction count of
204e0 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
204f0 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
20500 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20  ction count .   
20510 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73   ** reaches 0, s
20520 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
20530 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
20540 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72  E. The unlockBtr
20550 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20  eeIfUnused().   
20560 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77   ** call below w
20570 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  ill unlock the p
20580 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ager.  */.    if
20590 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
205a0 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
205b0 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64    clearAllShared
205c0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
205d0 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  p);.      pBt->n
205e0 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
205f0 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d       if( 0==pBt-
20600 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
20610 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
20620 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
20630 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  ANS_NONE;.      
20640 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
20650 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  Set the current 
20660 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74  transaction stat
20670 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20  e to TRANS_NONE 
20680 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a  and unlock the .
20690 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20      ** pager if 
206a0 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
206b0 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
206c0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
206d0 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e  ion.  */.    p->
206e0 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
206f0 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b  NONE;.    unlock
20700 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
20710 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
20720 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a  Integrity(p);.}.
20730 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
20740 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  e transaction cu
20750 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
20760 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
20770 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
20780 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  ts the second ph
20790 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65  ase of a 2-phase
207a0 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a   commit.  The.**
207b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
207c0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f  mitPhaseOne() ro
207d0 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
207e0 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
207f0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f  hould.** be invo
20800 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  ked prior to cal
20810 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
20820 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
20830 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
20840 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ne().** routine 
20850 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b  did all the work
20860 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f   of writing info
20870 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  rmation out to d
20880 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67  isk and flushing
20890 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
208a0 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72   so that they ar
208b0 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  e written onto t
208c0 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e  he disk platter.
208d0 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f    All this.** ro
208e0 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  utine has to do 
208f0 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75  is delete or tru
20900 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
20910 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a  e header in the.
20920 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
20930 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63  journal (which c
20940 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
20950 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
20960 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63   and.** drop loc
20970 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  ks..**.** Normal
20980 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ly, if an error 
20990 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
209a0 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20   pager layer is 
209b0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a  attempting to .*
209c0 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75  * finalize the u
209d0 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61  nderlying journa
209e0 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e  l file, this fun
209f0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ction returns an
20a00 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68   error and.** th
20a10 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69  e upper layer wi
20a20 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c  ll attempt a rol
20a30 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20  lback. However, 
20a40 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
20a50 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e  gument.** is non
20a60 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20  -zero then this 
20a70 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69  b-tree transacti
20a80 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  on is part of a 
20a90 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74  multi-file .** t
20aa0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74  ransaction. In t
20ab0 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72  his case, the tr
20ac0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
20ad0 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69  ready been commi
20ae0 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c  tted .** (by del
20af0 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  eting a master j
20b00 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
20b10 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
20b20 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a   ignore this .**
20b30 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
20b40 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e  n code. So, even
20b50 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
20b60 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72  urs in the pager
20b70 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74   layer,.** reset
20b80 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65   the b-tree obje
20b90 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  cts internal sta
20ba0 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  te to indicate t
20bb0 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a  hat the write.**
20bc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
20bd0 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68   been closed. Th
20be0 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65  is is quite safe
20bf0 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77  , as the pager w
20c00 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e  ill have.** tran
20c10 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20  sitioned to the 
20c20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a  error state..**.
20c30 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
20c40 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
20c50 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
20c60 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
20c70 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
20c80 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
20c90 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
20ca0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
20cb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
20cc0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
20cd0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43  Btree *p, int bC
20ce0 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20  leanup){..  if( 
20cf0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
20d00 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20  S_NONE ) return 
20d10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
20d20 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20d30 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
20d40 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
20d50 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
20d60 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
20d70 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74  ion open, commit
20d80 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
20d90 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  es .  ** transac
20da0 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65  tion and set the
20db0 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
20dc0 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a   TRANS_READ..  *
20dd0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
20de0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
20df0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
20e00 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
20e10 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
20e20 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
20e30 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
20e40 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73  _WRITE );.    as
20e50 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
20e60 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
20e70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20e80 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
20e90 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
20ea0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20eb0 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70  E_OK && bCleanup
20ec0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
20ed0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
20ee0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20ef0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rc;.    }.    p-
20f00 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b  >iDataVersion--;
20f10 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20    /* Compensate 
20f20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61 74  for pPager->iDat
20f30 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20  aVersion++; */. 
20f40 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
20f50 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
20f60 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
20f70 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
20f80 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
20f90 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
20fa0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
20fb0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
20fc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20fd0 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
20fe0 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
20ff0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
21000 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
21010 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
21020 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
21030 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
21040 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
21050 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
21060 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
21070 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
21080 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
21090 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c  ommitPhaseTwo(p,
210a0 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
210b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
210c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
210d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
210e0 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
210f0 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
21100 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
21110 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
21120 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
21130 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53 68  rsor on any BtSh
21140 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
21150 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20  .** references. 
21160 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74 65   Or if the write
21170 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74  Only flag is set
21180 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79   to 1, then only
21190 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20 63  .** trip write c
211a0 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76 65  ursors and leave
211b0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75 6e   read cursors un
211c0 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  changed..**.** E
211d0 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 61  very cursor is a
211e0 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
211f0 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64   tripped, includ
21200 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74  ing cursors.** t
21210 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74  hat belong to ot
21220 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
21230 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  nections that ha
21240 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68  ppen to be.** sh
21250 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65 20  aring the cache 
21260 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a  with pBtree..**.
21270 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
21280 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  gets called when
21290 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
212a0 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74 65  rs. If the write
212b0 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Only.** flag is 
212c0 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  true, then only 
212d0 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e 65  write-cursors ne
212e0 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d 20  ed be tripped - 
212f0 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72  read-only.** cur
21300 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72 20  sors save their 
21310 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
21320 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 6d  s so that they m
21330 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20  ay continue .** 
21340 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f  following the ro
21350 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77  llback. Or, if w
21360 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
21370 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  e, all cursors a
21380 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20  re .** tripped. 
21390 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69 74  In general, writ
213a0 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20 69  eOnly is false i
213b0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
213c0 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65  n being.** rolle
213d0 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64 20  d back modified 
213e0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
213f0 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ema. In this cas
21400 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a  e b-tree root.**
21410 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d 6f   pages may be mo
21420 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66  ved or deleted f
21430 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
21440 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b   altogether, mak
21450 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65  ing.** it unsafe
21460 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72   for read cursor
21470 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a  s to continue..*
21480 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69 74  *.** If the writ
21490 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74 72  eOnly flag is tr
214a0 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ue and an error 
214b0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
214c0 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20  hile .** saving 
214d0 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
214e0 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f  tion of a read-o
214f0 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20  nly cursor, all 
21500 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63  cursors, .** inc
21510 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d  luding all read-
21520 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
21530 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ped..**.** SQLIT
21540 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
21550 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
21560 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
21570 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73  ccurs while.** s
21580 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20 70  aving a cursor p
21590 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69  osition, an SQLi
215a0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
215b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
215c0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
215d0 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
215e0 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e 74  int errCode, int
215f0 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42   writeOnly){.  B
21600 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e  tCursor *p;.  in
21610 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21620 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 72  ;..  assert( (wr
21630 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72  iteOnly==0 || wr
21640 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42  iteOnly==1) && B
21650 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31  TCF_WriteFlag==1
21660 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65   );.  if( pBtree
21670 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
21680 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
21690 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74  );.    for(p=pBt
216a0 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
216b0 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
216c0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
216d0 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 4f        if( writeO
216e0 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c  nly && (p->curFl
216f0 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
21700 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Flag)==0 ){.    
21710 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
21720 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
21730 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  || p->eState==CU
21740 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b  RSOR_SKIPNEXT ){
21750 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21760 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
21770 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  on(p);.         
21780 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21790 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
217a0 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42    (void)sqlite3B
217b0 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
217c0 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30  rs(pBtree, rc, 0
217d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
217e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
217f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21810 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
21820 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
21830 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
21840 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
21850 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65         p->skipNe
21860 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
21870 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
21880 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65  i=0; i<=p->iPage
21890 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
218a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61  releasePage(p->a
218b0 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
218c0 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
218d0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
218e0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
218f0 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
21900 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
21910 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
21920 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
21930 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
21940 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43  ..**.** If tripC
21950 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54  ode is not SQLIT
21960 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72  E_OK then cursor
21970 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69  s will be invali
21980 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29 2e  dated (tripped).
21990 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
219a0 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70  ursors are tripp
219b0 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
219c0 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20  is true but all 
219d0 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74  cursors are.** t
219e0 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f  ripped if writeO
219f0 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41  nly is false.  A
21a00 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
21a10 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63  e.** a tripped c
21a20 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c  ursor will resul
21a30 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t in an error..*
21a40 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
21a50 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
21a60 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
21a70 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
21a80 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
21a90 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
21aa0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
21ab0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
21ac0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21ad0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
21ae0 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f  e *p, int tripCo
21af0 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c  de, int writeOnl
21b00 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  y){.  int rc;.  
21b10 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
21b20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
21b30 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73  e *pPage1;..  as
21b40 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d  sert( writeOnly=
21b50 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d  =1 || writeOnly=
21b60 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
21b70 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
21b80 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20  _ABORT_ROLLBACK 
21b90 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  || tripCode==SQL
21ba0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69  ITE_OK );.  sqli
21bb0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
21bc0 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  ;.  if( tripCode
21bd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21be0 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65     rc = tripCode
21bf0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
21c00 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
21c10 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74 65    if( rc ) write
21c20 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Only = 0;.  }els
21c30 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
21c40 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
21c50 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20   tripCode ){.   
21c60 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74   int rc2 = sqlit
21c70 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
21c80 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64  rsors(p, tripCod
21c90 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20  e, writeOnly);. 
21ca0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
21cb0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69  QLITE_OK || (wri
21cc0 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32  teOnly==0 && rc2
21cd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a  ==SQLITE_OK) );.
21ce0 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
21cf0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
21d00 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e  2;.  }.  btreeIn
21d10 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
21d20 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
21d30 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
21d40 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
21d50 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
21d60 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
21d70 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
21d80 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
21d90 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
21da0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
21db0 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
21dc0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
21dd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
21de0 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
21df0 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
21e00 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
21e10 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
21e20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65   ** call btreeGe
21e30 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
21e40 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
21e50 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
21e60 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
21e70 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
21e80 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50     if( btreeGetP
21e90 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
21ea0 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
21eb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
21ec0 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
21ed0 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
21ee0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74  >aData);.      t
21ef0 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d  estcase( nPage==
21f00 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
21f10 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65  Page==0 ) sqlite
21f20 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
21f30 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
21f40 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  age);.      test
21f50 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65  case( pBt->nPage
21f60 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20  !=nPage );.     
21f70 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
21f80 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  age;.      relea
21f90 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
21fa0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21fb0 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
21fc0 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29  ors(pBt, 1)==0 )
21fd0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
21fe0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
21ff0 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65  _READ;.    btree
22000 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
22010 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
22020 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
22030 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
22040 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
22050 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22060 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
22070 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
22080 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
22090 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72  saction can be r
220a0 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  olled.** back in
220b0 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
220c0 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
220d0 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74  ion. You must st
220e0 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
220f0 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61  n .** before sta
22100 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
22110 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
22120 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
22130 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
22140 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69  y .** if the mai
22150 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  n transaction co
22160 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
22170 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ack..**.** State
22180 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
22190 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
221a0 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
221b0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
221c0 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
221d0 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
221e0 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
221f0 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
22200 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
22210 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
22220 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
22230 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
22240 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
22250 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
22260 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
22270 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
22280 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
22290 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61  ion..**.** A sta
222a0 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73  tement sub-trans
222b0 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  action is implem
222c0 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e  ented as an anon
222d0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e  ymous savepoint.
222e0 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61   The.** value pa
222f0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
22300 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
22310 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
22320 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a   of savepoints,.
22330 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
22340 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73   new anonymous s
22350 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f  avepoint, open o
22360 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e  n the B-Tree. i.
22370 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61  e. if there.** a
22380 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
22390 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f  epoints and no o
223a0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74  ther statement-t
223b0 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
223c0 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20  ,.** iStatement 
223d0 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79  is 1. This anony
223e0 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63  mous savepoint c
223f0 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f  an be released o
22400 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a  r rolled back.**
22410 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
22420 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
22430 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
22440 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22450 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
22460 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65  *p, int iStateme
22470 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
22480 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
22490 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
224a0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
224b0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
224c0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
224d0 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
224e0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
224f0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
22500 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
22510 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  iStatement>0 );.
22520 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
22530 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76  ment>p->db->nSav
22540 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65  epoint );.  asse
22550 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
22560 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
22570 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74  ITE );.  /* At t
22580 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
22590 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
225a0 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
225b0 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a  epoint with.  **
225c0 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
225d0 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70  r than all savep
225e0 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78  oints created ex
225f0 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20  plicitly using. 
22600 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
22610 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
22620 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
22630 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
22640 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76  ny.  ** such sav
22650 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68  epoints while th
22660 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
22670 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
22680 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a  t is active..  *
22690 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
226a0 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
226b0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
226c0 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73  iStatement);.  s
226d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
226e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
226f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
22700 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
22710 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
22720 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53   op, is always S
22730 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
22740 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e  K.** or SAVEPOIN
22750 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20  T_RELEASE. This 
22760 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20  function either 
22770 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c  releases or roll
22780 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61  s back the.** sa
22790 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69  vepoint identifi
227a0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
227b0 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65  iSavepoint, depe
227c0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c  nding on the val
227d0 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a  ue .** of op..**
227e0 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53  .** Normally, iS
227f0 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
22800 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
22810 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76  l to zero. Howev
22820 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20  er, if op is.** 
22830 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
22840 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f  CK, then iSavepo
22850 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  int may also be 
22860 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  -1. In this case
22870 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
22880 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  s of the entire 
22890 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20  transaction are 
228a0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
228b0 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a  s is different.*
228c0 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20  * from a normal 
228d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
228e0 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b  back, as no lock
228f0 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61  s are released a
22900 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  nd the.** transa
22910 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70  ction remains op
22920 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
22930 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
22940 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f  (Btree *p, int o
22950 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
22960 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
22970 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
22980 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  p && p->inTrans=
22990 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
229a0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
229b0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
229c0 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
229d0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
229e0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
229f0 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61  OLLBACK );.    a
22a00 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
22a10 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f  t>=0 || (iSavepo
22a20 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53  int==-1 && op==S
22a30 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
22a40 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  K) );.    sqlite
22a50 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
22a60 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45      if( op==SAVE
22a70 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
22a80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
22a90 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
22aa0 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
22ab0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22ac0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
22ad0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
22ae0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
22af0 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
22b00 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  int);.    }.    
22b10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22b20 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
22b30 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28  Savepoint<0 && (
22b40 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
22b50 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
22b60 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  PTY)!=0 ){.     
22b70 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
22b80 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
22b90 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
22ba0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42  e(pBt);.      pB
22bb0 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62  t->nPage = get4b
22bc0 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50  yte(28 + pBt->pP
22bd0 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20  age1->aData);.. 
22be0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
22bf0 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72  base size was wr
22c00 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f  itten into the o
22c10 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20  ffset 28 of the 
22c20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20  header.      ** 
22c30 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
22c40 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f  tion started, so
22c50 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
22c60 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65  e value at offse
22c70 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73  t.      ** 28 is
22c80 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20   nonzero. */.   
22c90 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
22ca0 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d  nPage>0 );.    }
22cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22cc0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
22cd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22ce0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
22cf0 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  w cursor for the
22d00 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f   BTree whose roo
22d10 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65  t is on the page
22d20 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61  .** iTable. If a
22d30 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
22d40 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
22d50 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
22d60 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  at.** the caller
22d70 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20   already has at 
22d80 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c  least a read-onl
22d90 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  y transaction op
22da0 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  en.** on the dat
22db0 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49  abase already. I
22dc0 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  f a write-cursor
22dd0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
22de0 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hen.** the calle
22df0 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  r is assumed to 
22e00 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
22e10 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te transaction..
22e20 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 54 52  **.** If the BTR
22e30 45 45 5f 57 52 43 53 52 20 62 69 74 20 6f 66 20  EE_WRCSR bit of 
22e40 77 72 46 6c 61 67 20 69 73 20 63 6c 65 61 72 2c  wrFlag is clear,
22e50 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
22e60 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20   can only.** be 
22e70 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
22e80 2e 20 20 49 66 20 74 68 65 20 42 54 52 45 45 5f  .  If the BTREE_
22e90 57 52 43 53 52 20 62 69 74 20 69 73 20 73 65 74  WRCSR bit is set
22ea0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
22eb0 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  r.** can be used
22ec0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
22ed0 66 6f 72 20 77 72 69 74 69 6e 67 20 69 66 20 6f  for writing if o
22ee0 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
22ef0 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61  for writing.** a
22f00 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
22f10 65 73 65 20 61 72 65 20 74 68 65 20 63 6f 6e 64  ese are the cond
22f20 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
22f30 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
22f40 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e 67 20  .** for writing 
22f50 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  to be allowed:.*
22f60 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
22f70 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
22f80 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
22f90 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67  rFlag containing
22fa0 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a   BTREE_WRCSR.**.
22fb0 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
22fc0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
22fd0 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
22fe0 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
22ff0 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
23000 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
23010 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
23020 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
23030 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
23040 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
23050 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
23060 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
23070 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
23080 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
23090 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
230a0 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
230b0 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
230c0 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
230d0 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
230e0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
230f0 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
23100 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
23110 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
23120 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
23130 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
23140 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
23150 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
23160 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45  ..**.** The BTRE
23170 45 5f 46 4f 52 44 45 4c 45 54 45 20 62 69 74 20  E_FORDELETE bit 
23180 6f 66 20 77 72 46 6c 61 67 20 6d 61 79 20 6f 70  of wrFlag may op
23190 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74 20  tionally be set 
231a0 69 66 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a  if BTREE_WRCSR.*
231b0 2a 20 69 73 20 73 65 74 2e 20 20 49 66 20 46 4f  * is set.  If FO
231c0 52 44 45 4c 45 54 45 20 69 73 20 73 65 74 2c 20  RDELETE is set, 
231d0 74 68 61 74 20 69 73 20 61 20 68 69 6e 74 20 74  that is a hint t
231e0 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  o the implementa
231f0 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69  tion that.** thi
23200 73 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e  s cursor will on
23210 6c 79 20 62 65 20 75 73 65 64 20 74 6f 20 73 65  ly be used to se
23220 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65 74 65  ek to and delete
23230 20 65 6e 74 72 69 65 73 20 6f 66 20 61 6e 20 69   entries of an i
23240 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61 72 74 20  ndex.** as part 
23250 6f 66 20 61 20 6c 61 72 67 65 72 20 44 45 4c 45  of a larger DELE
23260 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  TE statement.  T
23270 68 65 20 46 4f 52 44 45 4c 45 54 45 20 68 69 6e  he FORDELETE hin
23280 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79  t is not used by
23290 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d 65  .** this impleme
232a0 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e  ntation.  But in
232b0 20 61 20 68 79 70 6f 74 68 65 74 69 63 61 6c 20   a hypothetical 
232c0 61 6c 74 65 72 6e 61 74 69 76 65 20 73 74 6f 72  alternative stor
232d0 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69  age engine .** i
232e0 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20 65 6e  n which index en
232f0 74 72 69 65 73 20 61 72 65 20 61 75 74 6f 6d 61  tries are automa
23300 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
23310 77 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69  when correspondi
23320 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73  ng table.** rows
23330 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20 74 68   are deleted, th
23340 65 20 46 4f 52 44 45 4c 45 54 45 20 66 6c 61 67  e FORDELETE flag
23350 20 69 73 20 61 20 68 69 6e 74 20 74 68 61 74 20   is a hint that 
23360 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44 45 4c  all SEEK and DEL
23370 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ETE.** operation
23380 73 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72  s on this cursor
23390 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61   can be no-ops a
233a0 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f 70 65 72  nd all READ oper
233b0 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72  ations can .** r
233c0 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77  eturn a null row
233d0 20 28 32 2d 62 79 74 65 73 3a 20 30 78 30 31 20   (2-bytes: 0x01 
233e0 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  0x00)..**.** No 
233f0 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
23400 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
23410 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
23420 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
23430 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
23440 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
23450 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
23460 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
23470 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
23480 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
23490 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
234a0 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42  hat the sqlite3B
234b0 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29  treeCursorZero()
234c0 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
234d0 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69  .** on pCur to i
234e0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
234f0 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72  mory space prior
23500 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
23510 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  s routine..*/.st
23520 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75  atic int btreeCu
23530 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
23540 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23560 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
23570 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
23580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23590 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
235a0 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
235b0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
235c0 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
235d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235e0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
235f0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
23600 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
23610 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
23620 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
23630 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69  t arg to compari
23640 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  son function */.
23650 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
23660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23670 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
23680 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72  e for new cursor
23690 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
236a0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
236b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236c0 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65  /* Shared b-tree
236d0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43   handle */.  BtC
236e0 75 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20 20  ursor *pX;      
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23700 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f      /* Looping o
23710 76 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63 75  ver other all cu
23720 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65  rsors */..  asse
23730 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
23740 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
23750 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
23760 67 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  g==0 .       || 
23770 77 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52  wrFlag==BTREE_WR
23780 43 53 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 77  CSR .       || w
23790 72 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57 52  rFlag==(BTREE_WR
237a0 43 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c  CSR|BTREE_FORDEL
237b0 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a  ETE) .  );..  /*
237c0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
237d0 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73  ssert statements
237e0 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20   verify that if 
237f0 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62  this is a sharab
23800 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20  le .  ** b-tree 
23810 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f  database, the co
23820 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64  nnection is hold
23830 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64  ing the required
23840 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20   table locks, . 
23850 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20   ** and that no 
23860 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
23870 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75   has any open cu
23880 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69  rsor that confli
23890 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74  cts with .  ** t
238a0 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20  his lock.  */.  
238b0 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65  assert( hasShare
238c0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
238d0 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49  p, iTable, pKeyI
238e0 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f  nfo!=0, (wrFlag?
238f0 32 3a 31 29 29 20 29 3b 0a 20 20 61 73 73 65 72  2:1)) );.  asser
23900 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
23910 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
23920 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a  s(p, iTable) );.
23930 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
23940 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
23950 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75   opened the requ
23960 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  ired transaction
23970 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
23980 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
23990 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  NONE );.  assert
239a0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70  ( wrFlag==0 || p
239b0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
239c0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
239d0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  rt( pBt->pPage1 
239e0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
239f0 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
23a00 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
23a10 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
23a20 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
23a30 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46  =0 );..  if( wrF
23a40 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63  lag ){.    alloc
23a50 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  ateTempSpace(pBt
23a60 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
23a70 70 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72  pTmpSpace==0 ) r
23a80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
23a90 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  EM_BKPT;.  }.  i
23aa0 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20  f( iTable==1 && 
23ab0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
23ac0 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Bt)==0 ){.    as
23ad0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
23ae0 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20  );.    iTable = 
23af0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  0;.  }..  /* Now
23b00 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
23b10 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
23b20 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
23b30 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
23b40 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61    ** variables a
23b50 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73  nd link the curs
23b60 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68  or into the BtSh
23b70 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20  ared list.  */. 
23b80 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
23b90 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a  = (Pgno)iTable;.
23ba0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
23bb0 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  -1;.  pCur->pKey
23bc0 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
23bd0 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
23be0 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  = p;.  pCur->pBt
23bf0 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e   = pBt;.  pCur->
23c00 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  curFlags = wrFla
23c10 67 20 3f 20 42 54 43 46 5f 57 72 69 74 65 46 6c  g ? BTCF_WriteFl
23c20 61 67 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ag : 0;.  pCur->
23c30 63 75 72 50 61 67 65 72 46 6c 61 67 73 20 3d 20  curPagerFlags = 
23c40 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50 41 47  wrFlag ? 0 : PAG
23c50 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b  ER_GET_READONLY;
23c60 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
23c70 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  re two or more c
23c80 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61  ursors on the sa
23c90 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61  me btree, then a
23ca0 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63 75 72  ll such.  ** cur
23cb0 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61 76 65  sors *must* have
23cc0 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70   the BTCF_Multip
23cd0 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a  le flag set. */.
23ce0 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43    for(pX=pBt->pC
23cf0 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58  ursor; pX; pX=pX
23d00 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
23d10 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  ( pX->pgnoRoot==
23d20 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a  (Pgno)iTable ){.
23d30 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46 6c 61        pX->curFla
23d40 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69  gs |= BTCF_Multi
23d50 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ple;.      pCur-
23d60 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
23d70 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20  F_Multiple;.    
23d80 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e  }.  }.  pCur->pN
23d90 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  ext = pBt->pCurs
23da0 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73  or;.  pBt->pCurs
23db0 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
23dc0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
23dd0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65  OR_INVALID;.  re
23de0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23df0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
23e00 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
23e10 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
23e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
23e40 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
23e50 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
23e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e70 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
23e80 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
23e90 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
23ea0 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
23eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ec0 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
23ed0 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
23ee0 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
23ef0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
23f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f10 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
23f20 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
23f30 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
23f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23f60 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
23f70 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
23f80 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62  t rc;.  if( iTab
23f90 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  le<1 ){.    rc =
23fa0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
23fb0 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BKPT;.  }else{. 
23fc0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
23fd0 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
23fe0 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
23ff0 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
24000 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
24010 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
24020 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
24030 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24040 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
24050 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72   size of a BtCur
24060 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79  sor object in by
24070 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tes..**.** This 
24080 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65  interfaces is ne
24090 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65  eded so that use
240a0 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61  rs of cursors ca
240b0 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a  n preallocate.**
240c0 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72   sufficient stor
240d0 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75  age to hold a cu
240e0 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72  rsor.  The BtCur
240f0 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  sor object is op
24100 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73  aque.** to users
24110 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   so they cannot 
24120 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20  do the sizeof() 
24130 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65  themselves - the
24140 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74  y must call.** t
24150 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
24160 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
24170 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29  CursorSize(void)
24180 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  {.  return ROUND
24190 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  8(sizeof(BtCurso
241a0 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  r));.}../*.** In
241b0 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
241c0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  that will be con
241d0 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74  verted into a Bt
241e0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a  Cursor object..*
241f0 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20  *.** The simple 
24200 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f  approach here wo
24210 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74  uld be to memset
24220 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62  () the entire ob
24230 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e  ject.** to zero.
24240 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f    But it turns o
24250 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61  ut that the apPa
24260 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d  ge[] and aiIdx[]
24270 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f   arrays.** do no
24280 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72  t need to be zer
24290 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65  oed and they are
242a0 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61   large, so we ca
242b0 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20  n save a lot.** 
242c0 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73  of run-time by s
242d0 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
242e0 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
242f0 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f  ose elements..*/
24300 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
24310 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43  eeCursorZero(BtC
24320 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d  ursor *p){.  mem
24330 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74  set(p, 0, offset
24340 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61  of(BtCursor, iPa
24350 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ge));.}../*.** C
24360 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
24370 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
24380 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24390 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
243a0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
243b0 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
243c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
243d0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
243e0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
243f0 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
24400 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
24410 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
24420 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
24430 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
24440 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
24450 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
24460 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73  r(pBtree);.    s
24470 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
24480 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
24490 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
244a0 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20  Cursor!=0 );.   
244b0 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f   if( pBt->pCurso
244c0 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20  r==pCur ){.     
244d0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
244e0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
244f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74   }else{.      Bt
24500 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20  Cursor *pPrev = 
24510 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
24520 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
24530 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74  if( pPrev->pNext
24540 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==pCur ){.      
24550 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74      pPrev->pNext
24560 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
24570 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
24580 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24590 20 20 20 70 50 72 65 76 20 3d 20 70 50 72 65 76     pPrev = pPrev
245a0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
245b0 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50  while( ALWAYS(pP
245c0 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  rev) );.    }.  
245d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
245e0 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
245f0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
24600 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
24610 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  i]);.    }.    u
24620 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
24630 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ed(pBt);.    sql
24640 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
24650 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  aOverflow);.    
24660 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
24670 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
24680 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
24690 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
246a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
246b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
246c0 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
246d0 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
246e0 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
246f0 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
24700 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
24710 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
24720 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
24730 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  l.** btreeParseC
24740 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
24750 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
24760 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
24770 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
24780 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
24790 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
247a0 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
247b0 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
247c0 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62  er of calls to b
247d0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
247e0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
247f0 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
24800 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
24810 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
24820 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
24830 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  fo;.    int iPag
24840 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
24850 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
24860 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
24870 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61  o));.    btreePa
24880 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
24890 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75  Page[iPage], pCu
248a0 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a 20  r->ix, &info);. 
248b0 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
248c0 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28  PT_DB || memcmp(
248d0 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e  &info, &pCur->in
248e0 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
248f0 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  )==0 );.  }.#els
24900 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65  e.  #define asse
24910 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65  rtCellInfo(x).#e
24920 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49  ndif.static SQLI
24930 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
24940 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
24950 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
24960 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
24970 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Size==0 ){.    i
24980 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
24990 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43 75 72  >iPage;.    pCur
249a0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
249b0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
249c0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
249d0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
249e0 61 67 65 5d 2c 70 43 75 72 2d 3e 69 78 2c 26 70  age],pCur->ix,&p
249f0 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65  Cur->info);.  }e
24a00 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43  lse{.    assertC
24a10 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
24a20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44   }.}..#ifndef ND
24a30 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78  EBUG  /* The nex
24a40 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f  t routine used o
24a50 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
24a60 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
24a70 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  /./*.** Return t
24a80 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  rue if the given
24a90 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c   BtCursor is val
24aa0 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72  id.  A valid cur
24ab0 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68  sor is one.** th
24ac0 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
24ad0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f  pointing to a ro
24ae0 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74  w in a (non-empt
24af0 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  y) table..** Thi
24b00 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74  s is a verificat
24b10 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75  ion routine is u
24b20 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
24b30 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
24b40 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
24b50 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
24b60 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Valid(BtCursor *
24b70 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
24b80 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53  pCur && pCur->eS
24b90 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24ba0 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ID;.}.#endif /* 
24bb0 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73 71  NDEBUG */.int sq
24bc0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
24bd0 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72 73  IsValidNN(BtCurs
24be0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
24bf0 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a  ert( pCur!=0 );.
24c00 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65    return pCur->e
24c10 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
24c20 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  LID;.}../*.** Re
24c30 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
24c40 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  f the integer ke
24c50 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f 72  y or "rowid" for
24c60 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e 0a   a table btree..
24c70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24c80 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f  is only valid fo
24c90 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
24ca0 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f  is pointing into
24cb0 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 74   a.** ordinary t
24cc0 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66 20  able btree.  If 
24cd0 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
24ce0 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 74  s to an index bt
24cf0 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e 76  ree or.** is inv
24d00 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c 74  alid, the result
24d10 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
24d20 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
24d30 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72  /.i64 sqlite3Btr
24d40 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74 43  eeIntegerKey(BtC
24d50 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
24d60 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
24d70 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
24d80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
24d90 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
24da0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
24db0 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
24dc0 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  Key );.  getCell
24dd0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
24de0 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  turn pCur->info.
24df0 6e 4b 65 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nKey;.}../*.** R
24e00 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
24e10 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61 79   of bytes of pay
24e20 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e 74  load for the ent
24e30 72 79 20 74 68 61 74 20 70 43 75 72 20 69 73 0a  ry that pCur is.
24e40 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ** currently poi
24e50 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74  nting to.  For t
24e60 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68 69  able btrees, thi
24e70 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61 6d  s will be the am
24e80 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ount.** of data.
24e90 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72 65    For index btre
24ea0 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  es, this will be
24eb0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
24ec0 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   key..**.** The 
24ed0 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72  caller must guar
24ee0 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63  antee that the c
24ef0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
24f00 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a  g to a non-NULL.
24f10 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20  ** valid entry. 
24f20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
24f30 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
24f40 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72  cedure must guar
24f50 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68  antee.** that th
24f60 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72  e cursor has Cur
24f70 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53  sor.eState==CURS
24f80 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32  OR_VALID..*/.u32
24f90 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
24fa0 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73 6f  loadSize(BtCurso
24fb0 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
24fc0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24fd0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24fe0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
24ff0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
25000 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
25010 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74  nfo(pCur);.  ret
25020 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  urn pCur->info.n
25030 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  Payload;.}../*.*
25040 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
25050 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
25060 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
25070 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
25080 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
25090 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
250a0 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
250b0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
250c0 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
250d0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
250e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
250f0 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
25100 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
25110 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
25120 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
25130 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
25140 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
25150 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
25160 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
25170 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
25180 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
25190 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
251a0 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
251b0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
251c0 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
251d0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
251e0 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
251f0 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
25200 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
25210 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
25220 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
25230 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
25240 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
25250 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
25260 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
25270 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
25280 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
25290 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
252a0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
252b0 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
252c0 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
252d0 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
252e0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
252f0 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
25300 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
25310 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
25320 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
25330 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
25340 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
25350 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
25360 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
25370 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
25380 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
25390 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
253a0 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
253b0 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
253c0 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
253d0 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
253e0 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
253f0 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
25400 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
25410 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
25420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25430 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
25440 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
25450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25460 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
25470 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
25480 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
25490 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
254a0 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
254b0 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
254c0 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
254d0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
254e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
254f0 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
25500 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
25510 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
25520 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
25530 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
25540 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
25550 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25560 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
25570 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
25580 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
25590 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
255a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
255b0 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
255c0 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
255d0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
255e0 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
255f0 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
25600 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
25610 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
25620 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
25630 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
25640 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
25650 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
25660 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
25670 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
25680 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
25690 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
256a0 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
256b0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
256c0 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
256d0 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
256e0 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
256f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
25700 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
25710 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
25720 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
25730 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
25740 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
25750 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
25760 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
25770 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
25780 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
25790 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
257a0 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72   if( iGuess<=btr
257b0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
257c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
257d0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
257e0 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
257f0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
25800 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25810 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
25820 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
25830 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
25840 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
25850 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
25860 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
25870 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
25880 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
25890 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
258a0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
258b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
258c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
258d0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
258e0 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70  vfl, &pPage, (pp
258f0 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52  Page==0) ? PAGER
25900 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
25910 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
25920 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
25930 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
25940 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25950 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
25960 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
25970 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
25980 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
25990 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
259a0 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
259b0 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
259c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
259d0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
259e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
259f0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
25a00 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
25a10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
25a20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
25a30 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
25a40 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
25a50 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
25a60 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
25a70 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
25a80 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
25a90 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
25aa0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
25ab0 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
25ac0 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
25ad0 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
25ae0 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
25af0 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
25b00 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
25b10 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
25b20 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
25b30 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
25b40 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
25b50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
25b60 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
25b70 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
25b80 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
25b90 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
25ba0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
25bb0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
25bc0 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
25bd0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
25be0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
25bf0 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
25c00 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
25c10 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
25c20 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
25c30 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
25c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
25c50 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
25c60 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
25c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25c80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
25c90 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
25ca0 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
25cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
25cc0 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
25cd0 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
25ce0 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
25cf0 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
25d00 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
25d10 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
25d20 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
25d30 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
25d40 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
25d50 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
25d60 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
25d70 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
25d80 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
25d90 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
25da0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
25db0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
25dc0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
25dd0 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
25de0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
25df0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
25e00 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
25e10 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
25e20 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
25e30 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
25e40 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
25e50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
25e60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
25e70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
25e80 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
25e90 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
25ea0 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
25eb0 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
25ec0 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
25ed0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
25ee0 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a  g to. The eOp.**
25ef0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74   argument is int
25f00 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
25f10 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20  ows:.**.**   0: 
25f20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
25f30 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74   a read. Populat
25f40 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
25f50 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68  ache..**   1: Th
25f60 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
25f70 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65   write. Populate
25f80 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
25f90 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  che..**.** A tot
25fa0 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
25fb0 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
25fc0 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
25fd0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
25fe0 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
25ff0 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
26000 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
26010 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
26020 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
26030 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e   might appear on
26040 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a   the main page.*
26050 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  * or be scattere
26060 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
26070 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
26080 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
26090 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e  urrent cursor en
260a0 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
260b0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
260c0 67 65 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  ges.** this func
260d0 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74  tion may allocat
260e0 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  e space for and 
260f0 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 0a  lazily populate.
26100 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
26110 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
26120 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
26130 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20  aOverflow). .** 
26140 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
26150 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20   use this cache 
26160 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20  to make seeking 
26170 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
26180 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20  offset .** more 
26190 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
261a0 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
261b0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
261c0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
261d0 61 74 65 64 2c 20 69 74 20 6d 75 73 74 20 62 65  ated, it must be
261e0 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
261f0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
26200 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
26210 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
26220 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
26230 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
26240 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
26250 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
26260 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
26270 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
26280 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
26290 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
262a0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
262b0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
262c0 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
262d0 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
262e0 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
262f0 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
26300 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
26310 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
26320 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
26330 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
26340 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
26350 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
26360 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
26370 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
26380 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
26390 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
263a0 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  */.  u32 offset,
263b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
263c0 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
263d0 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
263e0 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20   */.  u32 amt,  
263f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26400 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
26410 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
26420 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
26430 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
26440 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
26450 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20   */ .  int eOp  
26460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
26470 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
26480 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
26490 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
264a0 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
264b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
264c0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64  TE_OK;.  int iId
264d0 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
264e0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
264f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26500 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61  ge]; /* Btree pa
26510 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e  ge of current en
26520 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
26530 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
26540 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
26550 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68       /* Btree th
26560 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
26570 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53  s to */.#ifdef S
26580 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
26590 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73  RFLOW_READ.  uns
265a0 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e  igned char * con
265b0 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20 70  st pBufStart = p
265c0 42 75 66 3b 20 20 20 20 20 2f 2a 20 53 74 61 72  Buf;     /* Star
265d0 74 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f 75  t of original ou
265e0 74 20 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e 64  t buffer */.#end
265f0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
26600 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
26610 20 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d   eOp==0 || eOp==
26620 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
26630 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26640 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
26650 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
26660 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
26670 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
26680 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
26690 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   );..  getCellIn
266a0 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
266b0 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
266c0 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61 73  o.pPayload;.  as
266d0 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74  sert( offset+amt
266e0 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   <= pCur->info.n
266f0 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73  Payload );..  as
26700 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e  sert( aPayload >
26710 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
26720 0a 20 20 69 66 28 20 28 75 70 74 72 29 28 61 50  .  if( (uptr)(aP
26730 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e  ayload - pPage->
26740 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e 75  aData) > (pBt->u
26750 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75 72  sableSize - pCur
26760 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29  ->info.nLocal) )
26770 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
26780 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
26790 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
267a0 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
267b0 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20 20  error.  The.    
267c0 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  ** conditional a
267d0 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a  bove is really:.
267e0 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79 6c      **    &aPayl
267f0 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
26800 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
26810 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
26820 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62  leSize].    ** b
26830 75 74 20 69 73 20 72 65 63 61 73 74 20 69 6e 74  ut is recast int
26840 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 66 6f  o its current fo
26850 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 65  rm to avoid inte
26860 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f  ger overflow pro
26870 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20  blems.    */.   
26880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
26890 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61 67  ORRUPT_PGNO(pPag
268a0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 20  e->pgno);.  }.. 
268b0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
268c0 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
268d0 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
268e0 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
268f0 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
26900 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
26910 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
26920 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
26930 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
26940 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
26950 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
26960 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
26970 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
26980 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
26990 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
269a0 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
269b0 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
269c0 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
269d0 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
269e0 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
269f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
26a00 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
26a10 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
26a20 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
26a30 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
26a40 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
26a50 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
26a60 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
26a70 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
26a80 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
26a90 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
26aa0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
26ab0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
26ac0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
26ad0 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20  nfo.nLocal]);.. 
26ae0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43     /* If the BtC
26af0 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
26b00 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  ] has not been a
26b10 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
26b20 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a  te it now..    *
26b30 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76  *.    ** The aOv
26b40 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69  erflow[] array i
26b50 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65  s sized at one e
26b60 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76  ntry for each ov
26b70 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
26b80 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ** in the overfl
26b90 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
26ba0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
26bb0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
26bc0 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73  page is.    ** s
26bd0 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c  tored in aOverfl
26be0 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61  ow[0], etc. A va
26bf0 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20  lue of 0 in the 
26c00 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
26c10 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22  y.    ** means "
26c20 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28  not yet known" (
26c30 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a  the cache is laz
26c40 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a  ily populated)..
26c50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
26c60 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
26c70 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
26c80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
26c90 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
26ca0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
26cb0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
26cc0 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
26cd0 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
26ce0 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66  nOvfl>pCur->nOvf
26cf0 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  lAlloc ){.      
26d00 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28    Pgno *aNew = (
26d10 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61  Pgno*)sqlite3Rea
26d20 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
26d30 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
26d40 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f  w, nOvfl*2*sizeo
26d50 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20  f(Pgno).        
26d60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
26d70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
26d80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26d90 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
26da0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26db0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f 76         pCur->nOv
26dc0 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c 2a  flAlloc = nOvfl*
26dd0 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  2;.          pCu
26de0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 61  r->aOverflow = a
26df0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  New;.        }. 
26e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
26e10 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  set(pCur->aOverf
26e20 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69  low, 0, nOvfl*si
26e30 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20  zeof(Pgno));.   
26e40 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
26e50 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f  s |= BTCF_ValidO
26e60 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  vfl;.    }else{.
26e70 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
26e80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
26e90 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
26ea0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
26eb0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 6e 74  the.      ** ent
26ec0 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
26ed0 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
26ee0 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
26ef0 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a 2a 20  , skip.      ** 
26f00 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
26f10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
26f20 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
26f30 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
26f40 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ze] ){.        i
26f50 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
26f60 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  flSize);.       
26f70 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
26f80 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
26f90 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  ];.        offse
26fa0 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
26fb0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
26fc0 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
26fd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26fe0 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20 20 20  && amt>0 );.    
26ff0 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67 65 20  while( nextPage 
27000 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  ){.      /* If r
27010 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
27020 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
27030 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
27040 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
27050 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
27060 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20  [iIdx]==0.      
27070 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d          || pCur-
27080 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
27090 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20  ==nextPage.     
270a0 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52           || CORR
270b0 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20  UPT_DB );.      
270c0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
270d0 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
270e0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  ;..      if( off
270f0 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
27100 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
27110 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
27120 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
27130 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
27140 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
27150 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
27160 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
27170 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
27180 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
27190 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
271a0 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
271b0 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
271c0 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
271d0 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
271e0 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
271f0 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
27200 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
27210 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
27220 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
27230 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27240 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
27250 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
27260 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20  alidOvfl );.    
27270 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
27280 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42  ->pBtree->db==pB
27290 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20  t->db );.       
272a0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
272b0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
272c0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
272d0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
272e0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
272f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27300 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
27310 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
27320 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
27330 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
27340 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73    }.        offs
27350 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
27360 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27370 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
27380 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
27390 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
273a0 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
273b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
273c0 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
273d0 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
273e0 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
273f0 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
27400 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
27410 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
27420 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
27430 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
27440 64 3b 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20  d;      /* File 
27450 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 6f  from which to do
27460 20 64 69 72 65 63 74 20 6f 76 65 72 66 6c 6f 77   direct overflow
27470 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a   read */.#endif.
27480 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
27490 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  amt;.        if(
274a0 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
274b0 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
274c0 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
274d0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
274e0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
274f0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
27500 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
27510 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66   /* If all the f
27520 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
27530 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e:.        **.  
27540 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68        **   1) th
27550 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
27560 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20  ration, and .   
27570 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74       **   2) dat
27580 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72  a is required fr
27590 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
275a0 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61  this overflow pa
275b0 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ge, and.        
275c0 2a 2a 20 20 20 33 29 20 74 68 65 72 65 20 69 73  **   3) there is
275d0 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d 74   no open write-t
275e0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
275f0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20          **   4) 
27600 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
27610 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64  file-backed, and
27620 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29  .        **   5)
27630 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
27640 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69 6c 65   in the WAL file
27650 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29  .        **   6)
27660 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65   at least 4 byte
27670 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
27680 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68  een read into th
27690 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
276a0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
276b0 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61      ** then data
276c0 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72   can be read dir
276d0 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64  ectly from the d
276e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74  atabase file int
276f0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
27700 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20   output buffer, 
27710 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61  bypassing the pa
27720 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74  ge-cache altoget
27730 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73  her. This speeds
27740 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c  .        ** up l
27750 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63  oading large rec
27760 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d  ords that span m
27770 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
27780 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
27790 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
277a0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
277b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
277d0 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (1) */.        
277e0 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20   && offset==0   
277f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27810 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f         /* (2) */
27820 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
27830 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
27840 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20  =TRANS_READ     
27850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27860 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20  /* (3) */.      
27870 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69     && (fd = sqli
27880 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
27890 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74  ->pPager))->pMet
278a0 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 34 29 20  hods     /* (4) 
278b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 30  */.         && 0
278c0 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 55 73  ==sqlite3PagerUs
278d0 65 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  eWal(pBt->pPager
278e0 2c 20 6e 65 78 74 50 61 67 65 29 20 20 20 20 20  , nextPage)     
278f0 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20    /* (5) */.    
27900 20 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34       && &pBuf[-4
27910 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20 20  ]>=pBufStart    
27920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36             /* (6
27940 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a  ) */.        ){.
27950 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61            u8 aSa
27960 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  ve[4];.         
27970 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70   u8 *aWrite = &p
27980 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20  Buf[-4];.       
27990 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74     assert( aWrit
279a0 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20  e>=pBufStart ); 
279b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279c0 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65 20 74          /* due t
279d0 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20  o (6) */.       
279e0 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c     memcpy(aSave,
279f0 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20   aWrite, 4);.   
27a00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
27a10 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57  te3OsRead(fd, aW
27a20 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29  rite, a+4, (i64)
27a30 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e  pBt->pageSize*(n
27a40 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20  extPage-1));.   
27a50 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
27a60 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74  = get4byte(aWrit
27a70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  e);.          me
27a80 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61  mcpy(aWrite, aSa
27a90 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ve, 4);.        
27aa0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
27ab0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
27ac0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
27ad0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e;.          rc 
27ae0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
27af0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  t(pBt->pPager, n
27b00 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
27b10 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
27b20 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52   (eOp==0 ? PAGER
27b30 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
27b40 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  0).          );.
27b50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
27b60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27b70 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c             aPayl
27b80 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
27b90 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
27ba0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
27bb0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
27bc0 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
27bd0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
27be0 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
27bf0 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
27c00 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
27c10 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
27c20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
27c30 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
27c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66  .            off
27c50 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  set = 0;.       
27c60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
27c70 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b         amt -= a;
27c80 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 6d 74  .        if( amt
27c90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  ==0 ) return rc;
27ca0 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d  .        pBuf +=
27cb0 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   a;.      }.    
27cc0 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
27cd0 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a  ;.      iIdx++;.
27ce0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
27cf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
27d00 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 2f  & amt>0 ){.    /
27d10 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  * Overflow chain
27d20 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72 65 6c   ends prematurel
27d30 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
27d40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
27d50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67 6e 6f 29  GNO(pPage->pgno)
27d60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
27d70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
27d80 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61 79   part of the pay
27d90 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 6f 77  load for the row
27da0 20 61 74 20 77 68 69 63 68 20 74 68 61 74 20 63   at which that c
27db0 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 63 75  ursor pCur is cu
27dc0 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
27dd0 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79 74 65  ing.  "amt" byte
27de0 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
27df0 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  erred into pBuf[
27e00 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
27e10 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
27e20 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43  ffset"..**.** pC
27e30 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e 74 69  ur can be pointi
27e40 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61 20 74  ng to either a t
27e50 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65 78  able or an index
27e60 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20 70   b-tree..** If p
27e70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61 62  ointing to a tab
27e80 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 74  le btree, then t
27e90 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63 74 69  he content secti
27ea0 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49 66 0a  on is read.  If.
27eb0 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  ** pCur is point
27ec0 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20  ing to an index 
27ed0 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68 65 20  b-tree then the 
27ee0 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73 20 72  key section is r
27ef0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73  ead..**.** For s
27f00 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
27f10 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c 65 72  ad(), the caller
27f20 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
27f30 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
27f40 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
27f50 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62 6c   row in the tabl
27f60 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65 33 42  e.  For sqlite3B
27f70 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63 6b  treePayloadCheck
27f80 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75 72  ed(), the.** cur
27f90 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69 6e 76  sor might be inv
27fa0 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20 6e 65  alid or might ne
27fb0 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ed to be restore
27fc0 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72  d before being r
27fd0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ead..**.** Retur
27fe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
27ff0 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
28000 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
28010 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
28020 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
28030 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
28040 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
28050 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
28060 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
28070 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28080 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74 43  BtreePayload(BtC
28090 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
280a0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
280b0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
280c0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
280d0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
280e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
280f0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28100 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
28110 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
28120 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
28130 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28140 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28150 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 61 70 50  ur->ix<pCur->apP
28160 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28170 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
28180 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
28190 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
281a0 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
281b0 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
281c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72  ../*.** This var
281d0 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 42  iant of sqlite3B
281e0 74 72 65 65 50 61 79 6c 6f 61 64 28 29 20 77 6f  treePayload() wo
281f0 72 6b 73 20 65 76 65 6e 20 69 66 20 74 68 65 20  rks even if the 
28200 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a  cursor has not.*
28210 2a 20 69 6e 20 74 68 65 20 43 55 52 53 4f 52 5f  * in the CURSOR_
28220 56 41 4c 49 44 20 73 74 61 74 65 2e 20 20 49 74  VALID state.  It
28230 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
28240 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f   the sqlite3_blo
28250 62 5f 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65  b_read().** inte
28260 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  rface..*/.#ifnde
28270 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
28280 43 52 42 4c 4f 42 0a 73 74 61 74 69 63 20 53 51  CRBLOB.static SQ
28290 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
282a0 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43  t accessPayloadC
282b0 68 65 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  hecked(.  BtCurs
282c0 6f 72 20 2a 70 43 75 72 2c 0a 20 20 75 33 32 20  or *pCur,.  u32 
282d0 6f 66 66 73 65 74 2c 0a 20 20 75 33 32 20 61 6d  offset,.  u32 am
282e0 74 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 0a  t,.  void *pBuf.
282f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
28300 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
28310 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
28320 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
28330 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
28340 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
28350 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
28360 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ur) );.  rc = bt
28370 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
28380 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
28390 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 72 63    return rc ? rc
283a0 20 3a 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   : accessPayload
283b0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
283c0 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  mt, pBuf, 0);.}.
283d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
283e0 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 42  PayloadChecked(B
283f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
28400 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
28410 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
28420 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
28430 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
28440 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
28450 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
28460 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 20  red(pCur) );.   
28470 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
28480 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
28490 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
284a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
284b0 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
284c0 6c 6f 61 64 43 68 65 63 6b 65 64 28 70 43 75 72  loadChecked(pCur
284d0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
284e0 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Buf);.  }.}.#end
284f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
28500 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f  T_INCRBLOB */../
28510 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
28520 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
28530 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
28540 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
28550 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
28560 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
28570 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
28580 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
28590 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
285a0 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72  key if index btr
285b0 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
285c0 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68  ey==0) and is th
285d0 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61  e data for.** ta
285e0 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67  ble btrees (pPag
285f0 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54  e->intKey==1). T
28600 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
28610 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a  es of available.
28620 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  ** key/data is w
28630 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d  ritten into *pAm
28640 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
28650 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a   then the value.
28660 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ** returned will
28670 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20   not be a valid 
28680 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
28690 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
286a0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
286b0 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
286c0 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
286d0 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
286e0 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
286f0 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
28700 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
28710 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
28720 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
28730 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
28740 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
28750 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
28760 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
28770 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
28780 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
28790 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
287a0 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
287b0 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
287c0 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
287d0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
287e0 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
287f0 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
28800 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
28810 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
28820 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
28830 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
28840 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
28850 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
28860 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
28870 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
28880 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
28890 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
288a0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
288b0 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
288c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
288d0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76  /.static const v
288e0 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  oid *fetchPayloa
288f0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
28900 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
28910 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
28920 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
28930 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d  om */.  u32 *pAm
28940 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
28950 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
28960 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
28970 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  tes here */.){. 
28980 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73 65   u32 amt;.  asse
28990 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
289a0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
289b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
289c0 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61  ur->iPage]);.  a
289d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
289e0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
289f0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  D );.  assert( s
28a00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
28a10 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
28a20 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
28a30 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
28a40 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
28a50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28a60 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 61 70 50  ur->ix<pCur->apP
28a70 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28a80 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
28a90 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
28aa0 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73  nSize>0 );.  ass
28ab0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
28ac0 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61  pPayload>pCur->a
28ad0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28ae0 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52  e]->aData || COR
28af0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
28b00 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
28b10 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61  pPayload<pCur->a
28b20 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28b30 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43  e]->aDataEnd ||C
28b40 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d  ORRUPT_DB);.  am
28b50 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e  t = (int)(pCur->
28b60 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28b70 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20  ge]->aDataEnd - 
28b80 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
28b90 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72  oad);.  if( pCur
28ba0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d  ->info.nLocal<am
28bb0 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e  t ) amt = pCur->
28bc0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a  info.nLocal;.  *
28bd0 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65  pAmt = amt;.  re
28be0 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72  turn (void*)pCur
28bf0 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
28c00 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
28c10 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
28c20 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
28c30 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
28c40 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
28c50 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
28c60 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
28c70 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
28c80 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
28c90 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
28ca0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
28cb0 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
28cc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
28cd0 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
28ce0 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
28cf0 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
28d00 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
28d10 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
28d20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
28d30 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
28d40 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
28d50 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
28d60 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
28d70 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
28d80 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
28d90 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
28da0 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
28db0 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
28dc0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
28dd0 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
28de0 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
28df0 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
28e00 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
28e10 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
28e20 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
28e30 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
28e40 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
28e50 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
28e60 50 61 79 6c 6f 61 64 46 65 74 63 68 28 42 74 43  PayloadFetch(BtC
28e70 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
28e80 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72   *pAmt){.  retur
28e90 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  n fetchPayload(p
28ea0 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a  Cur, pAmt);.}...
28eb0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
28ec0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
28ed0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
28ee0 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
28ef0 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
28f00 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
28f10 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
28f20 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
28f30 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
28f40 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
28f50 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
28f60 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
28f70 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
28f80 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
28f90 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
28fa0 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
28fb0 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
28fc0 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
28fd0 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
28fe0 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
28ff0 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
29000 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
29010 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
29020 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
29030 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
29040 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
29050 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
29060 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61   pCur->pBt;..  a
29070 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
29080 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
29090 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
290a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
290b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
290c0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
290d0 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
290e0 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
290f0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
29100 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
29110 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
29120 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
29130 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29140 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
29150 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f    }.  pCur->info
29160 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
29170 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
29180 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
29190 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
291a0 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
291b0 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 5d 20 3d  pCur->iPage++] =
291c0 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43 75   pCur->ix;.  pCu
291d0 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 72 65 74  r->ix = 0;.  ret
291e0 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61  urn getAndInitPa
291f0 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
29200 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70   &pCur->apPage[p
29210 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20  Cur->iPage],.   
29220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29230 20 20 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d       pCur, pCur-
29240 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b  >curPagerFlags);
29250 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
29260 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61  E_DEBUG./*.** Pa
29270 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
29280 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
29290 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
292a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
292b0 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
292c0 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
292d0 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
292e0 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
292f0 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
29300 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
29310 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
29320 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
29330 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
29340 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
29350 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
29360 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
29370 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
29380 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
29390 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
293a0 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
293b0 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
293c0 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
293d0 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54  ){.  if( CORRUPT
293e0 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  _DB ) return;  /
293f0 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  * The conditions
29400 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69   tested below mi
29410 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a  ght not be true.
29420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29430 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
29440 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  n a corrupt data
29450 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  base */.  assert
29460 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
29470 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
29480 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
29490 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
294a0 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
294b0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
294c0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
294d0 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
294e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
294f0 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
29500 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
29510 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
29520 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
29530 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
29540 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
29550 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
29560 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
29570 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
29580 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
29590 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
295a0 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
295b0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
295c0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
295d0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
295e0 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
295f0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
29600 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
29610 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
29620 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
29630 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
29640 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
29650 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
29660 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29670 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
29680 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
29690 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
296a0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
296b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
296c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
296d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
296e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
296f0 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
29700 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
29710 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
29720 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
29730 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
29740 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
29750 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
29760 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29770 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
29780 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29790 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  age]->pgno.  );.
297a0 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72    testcase( pCur
297b0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
297c0 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61  age-1] > pCur->a
297d0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
297e0 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  e-1]->nCell );. 
297f0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
29800 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
29810 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
29820 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
29830 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70  _ValidOvfl);.  p
29840 43 75 72 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e  Cur->ix = pCur->
29850 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29860 65 2d 31 5d 3b 0a 20 20 72 65 6c 65 61 73 65 50  e-1];.  releaseP
29870 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d  ageNotNull(pCur-
29880 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29890 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  age--]);.}../*.*
298a0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
298b0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
298c0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
298d0 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
298e0 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
298f0 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
29900 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
29910 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
29920 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
29930 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
29940 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
29950 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
29960 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
29970 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
29980 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
29990 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
299a0 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
299b0 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
299c0 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
299d0 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
299e0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
299f0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
29a00 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
29a10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
29a20 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
29a30 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
29a40 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
29a50 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
29a60 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69  INVALID. Otherwi
29a70 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  se, the cursor i
29a80 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
29a90 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  o the first.** c
29aa0 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
29ab0 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74  he root (or virt
29ac0 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
29ad0 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
29ae0 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ate.** is set to
29af0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
29b00 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
29b10 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
29b20 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
29b30 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
29b40 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
29b50 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
29b60 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
29b70 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
29b80 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
29b90 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
29ba0 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
29bb0 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
29bc0 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
29bd0 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
29be0 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
29bf0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
29c00 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
29c10 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
29c20 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
29c30 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
29c40 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
29c50 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
29c60 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
29c70 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
29c80 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
29c90 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
29ca0 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
29cb0 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
29cc0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
29cd0 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
29ce0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
29cf0 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
29d00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
29d10 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29d20 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
29d30 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29d40 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
29d50 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
29d60 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
29d70 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
29d80 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
29d90 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
29da0 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
29db0 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
29dc0 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
29dd0 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
29de0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
29df0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
29e00 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29e10 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
29e20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
29e30 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f  ipNext!=SQLITE_O
29e40 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K );.      retur
29e50 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
29e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
29e70 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
29e80 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a  sor(pCur);.  }..
29e90 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
29ea0 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e>=0 ){.    if( 
29eb0 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20  pCur->iPage ){. 
29ec0 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
29ed0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
29ee0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29ef0 65 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  e]!=0 );.       
29f00 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
29f10 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ull(pCur->apPage
29f20 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29  [pCur->iPage--])
29f30 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
29f40 70 43 75 72 2d 3e 69 50 61 67 65 29 3b 0a 20 20  pCur->iPage);.  
29f50 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f 69 6e      goto skip_in
29f60 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  it;.    }.  }els
29f70 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f  e if( pCur->pgno
29f80 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Root==0 ){.    p
29f90 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
29fa0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
29fb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29fc0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
29fd0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29fe0 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20  Page==(-1) );.  
29ff0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
2a000 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72  tPage(pCur->pBtr
2a010 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70  ee->pBt, pCur->p
2a020 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
2a030 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20  apPage[0],.     
2a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a050 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50     0, pCur->curP
2a060 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20  agerFlags);.    
2a070 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a080 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
2a090 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2a0a0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
2a0b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a0c0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
2a0d0 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
2a0e0 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75  >curIntKey = pCu
2a0f0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
2a100 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f  tKey;.  }.  pRoo
2a110 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
2a120 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
2a130 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
2a140 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20  ->pgnoRoot );.. 
2a150 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
2a160 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
2a170 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
2a180 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
2a190 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  his cursor.  ** 
2a1a0 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
2a1b0 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
2a1c0 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
2a1d0 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
2a1e0 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  s.  ** NULL, the
2a1f0 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
2a200 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
2a210 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
2a220 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65  he case,.  ** re
2a230 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
2a240 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20  ORRUPT error. . 
2a250 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72   **.  ** Earlier
2a260 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
2a270 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ite assumed that
2a280 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64   this test could
2a290 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69   not fail.  ** i
2a2a0 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
2a2b0 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64  was already load
2a2c0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
2a2d0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
2a2e0 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70   (i.e..  ** if p
2a2f0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20  Cur->iPage>=0). 
2a300 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
2a310 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61  so if the databa
2a320 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
2a330 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20  .  ** in such a 
2a340 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52  way that page pR
2a350 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e  oot is linked in
2a360 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72  to a second b-tr
2a370 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28  ee table .  ** (
2a380 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29  or the freelist)
2a390 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2a3a0 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pRoot->intKey==1
2a3b0 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65   || pRoot->intKe
2a3c0 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  y==0 );.  if( pR
2a3d0 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c  oot->isInit==0 |
2a3e0 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  | (pCur->pKeyInf
2a3f0 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)!=pRoot->in
2a400 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
2a410 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2a420 54 5f 50 47 4e 4f 28 70 43 75 72 2d 3e 61 70 50  T_PGNO(pCur->apP
2a430 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2a440 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 6b  ->pgno);.  }..sk
2a450 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20 70 43 75  ip_init:  .  pCu
2a460 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43 75  r->ix = 0;.  pCu
2a470 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2a480 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2a490 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
2a4a0 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Last|BTCF_ValidN
2a4b0 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2a4c0 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d 20  fl);..  pRoot = 
2a4d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
2a4e0 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
2a4f0 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  ell>0 ){.    pCu
2a500 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2a510 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
2a520 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65  e if( !pRoot->le
2a530 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
2a540 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20  ubpage;.    if( 
2a550 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  pRoot->pgno!=1 )
2a560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2a570 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2a580 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
2a590 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
2a5a0 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
2a5b0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
2a5c0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2a5d0 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
2a5e0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2a5f0 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
2a600 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
2a610 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2a620 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20  _INVALID;.  }.  
2a630 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a640 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2a650 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
2a660 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
2a670 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2a680 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
2a690 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
2a6a0 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
2a6b0 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
2a6c0 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
2a6d0 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
2a6e0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
2a6f0 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
2a700 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
2a710 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
2a720 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
2a730 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
2a740 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
2a750 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
2a760 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2a770 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2a780 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2a790 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a7a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2a7b0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
2a7c0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2a7d0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
2a7e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2a7f0 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
2a800 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2a810 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e  pCur->ix<pPage->
2a820 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
2a830 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
2a840 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
2a850 72 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20  r->ix));.    rc 
2a860 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2a870 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
2a880 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2a890 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
2a8a0 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
2a8b0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
2a8c0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2a8d0 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
2a8e0 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
2a8f0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
2a900 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
2a910 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
2a920 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
2a930 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
2a940 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
2a950 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
2a960 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
2a970 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2a980 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
2a990 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
2a9a0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
2a9b0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2a9c0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
2a9d0 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
2a9e0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
2a9f0 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
2aa00 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
2aa10 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
2aa20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
2aa30 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2aa40 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
2aa50 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
2aa60 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
2aa70 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
2aa80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
2aa90 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
2aaa0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2aab0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2aac0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2aad0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2aae0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2aaf0 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
2ab00 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2ab10 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
2ab20 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
2ab30 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2ab40 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2ab50 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2ab60 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61    pCur->ix = pPa
2ab70 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
2ab80 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2ab90 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
2aba0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2abb0 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
2abc0 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  >ix = pPage->nCe
2abd0 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ll-1;.  assert( 
2abe0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2abf0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2ac00 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2ac10 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
2ac20 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  y)==0 );.  retur
2ac30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2ac40 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2ac50 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
2ac60 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2ac70 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
2ac80 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
2ac90 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
2aca0 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
2acb0 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
2acc0 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
2acd0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
2ace0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
2acf0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
2ad00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
2ad10 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
2ad20 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2ad30 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
2ad40 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2ad50 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2ad60 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2ad70 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2ad80 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2ad90 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
2ada0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2adb0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2adc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2add0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2ade0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
2adf0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2ae00 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2ae10 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2ae20 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2ae30 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2ae40 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2ae50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2ae60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2ae70 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2ae80 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2ae90 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2aea0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
2aeb0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2aec0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2aed0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
2aee0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2aef0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2af00 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2af10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
2af20 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
2af30 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
2af40 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
2af50 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
2af60 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
2af70 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
2af80 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2af90 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2afa0 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
2afb0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2afc0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2afd0 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
2afe0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2aff0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2b000 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2b010 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2b020 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2b030 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2b040 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
2b050 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
2b060 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
2b070 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
2b080 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
2b090 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
2b0a0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2b0b0 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2b0c0 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
2b0d0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
2b0e0 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
2b0f0 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
2b100 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
2b110 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
2b120 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
2b130 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2b140 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
2b150 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
2b160 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
2b170 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
2b180 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2b190 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
2b1a0 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
2b1b0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
2b1c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b1d0 69 78 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  ix==pCur->apPage
2b1e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2b1f0 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73  Cell-1 );.    as
2b200 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2b210 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2b220 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a  >leaf );.#endif.
2b230 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b240 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
2b250 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2b260 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2b270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2b280 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
2b290 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2b2a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2b2b0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2b2c0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2b2d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2b2e0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2b2f0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2b300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2b310 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2b320 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2b330 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
2b340 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
2b350 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2b360 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66  (pCur);.      if
2b370 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b380 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2b390 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2b3a0 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
2b3b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2b3c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2b3d0 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20   ~BTCF_AtLast;. 
2b3e0 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d       }.   .    }
2b3f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2b400 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
2b410 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
2b420 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
2b430 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
2b440 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
2b450 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
2b460 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
2b470 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
2b480 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
2b490 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
2b4a0 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
2b4b0 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
2b4c0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
2b4d0 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
2b4e0 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
2b4f0 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
2b500 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
2b510 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
2b520 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
2b530 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
2b540 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
2b550 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
2b560 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
2b570 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
2b580 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
2b590 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
2b5a0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
2b5b0 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
2b5c0 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
2b5d0 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
2b5e0 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
2b5f0 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
2b600 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
2b610 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
2b620 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
2b630 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
2b640 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
2b650 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
2b660 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
2b670 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
2b680 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
2b690 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
2b6a0 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
2b6b0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
2b6c0 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
2b6d0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
2b6e0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2b6f0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
2b700 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
2b710 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
2b720 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
2b730 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2b740 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
2b750 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
2b760 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
2b770 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
2b780 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
2b790 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
2b7a0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2b7b0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2b7c0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2b7d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2b7e0 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
2b7f0 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
2b800 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
2b810 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
2b820 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2b830 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2b840 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2b850 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
2b860 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
2b870 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
2b880 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
2b890 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d 3e 65  , the pIdxKey->e
2b8a0 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73 20 73  qSeen field is s
2b8b0 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 72 65  et to 1 if there
2b8c0 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20 65 6e  .** exists an en
2b8d0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2b8e0 20 74 68 61 74 20 65 78 61 63 74 6c 79 20 6d 61   that exactly ma
2b8f0 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e 20 20  tches pIdxKey.  
2b900 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2b910 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
2b920 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
2b930 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
2b940 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
2b950 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
2b960 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
2b970 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
2b980 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
2b990 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
2b9a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2b9b0 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
2b9c0 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
2b9d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2b9e0 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
2b9f0 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
2ba00 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
2ba10 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
2ba20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
2ba30 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
2ba40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2ba50 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  .  RecordCompare
2ba60 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b   xRecordCompare;
2ba70 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2ba80 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2ba90 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2baa0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2bab0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2bac0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2bad0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20  .  assert( pRes 
2bae0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  );.  assert( (pI
2baf0 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
2bb00 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29  ->pKeyInfo==0) )
2bb10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2bb20 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2bb30 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64 78 4b  _VALID || (pIdxK
2bb40 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 63  ey==0)==(pCur->c
2bb50 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29 3b 0a  urIntKey!=0) );.
2bb60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
2bb70 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
2bb80 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65  ositioned at the
2bb90 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72   point we are tr
2bba0 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76  ying.  ** to mov
2bbb0 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20  e to, then just 
2bbc0 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
2bbd0 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f  oing any work */
2bbe0 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d  .  if( pIdxKey==
2bbf0 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53  0.   && pCur->eS
2bc00 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2bc10 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  ID && (pCur->cur
2bc20 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2bc30 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29 7b 0a  idNKey)!=0.  ){.
2bc40 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2bc50 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
2bc60 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2bc70 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2bc80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2bc90 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
2bca0 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
2bcb0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
2bcc0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2bcd0 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
2bce0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
2bcf0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 72   = -1;.        r
2bd00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2bd10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
2bd20 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
2bd30 65 64 20 6b 65 79 20 69 73 20 6f 6e 65 20 6d 6f  ed key is one mo
2bd40 72 65 20 74 68 61 6e 20 74 68 65 20 70 72 65 76  re than the prev
2bd50 69 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e 0a 20  ious key, then. 
2bd60 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f 20 67       ** try to g
2bd70 65 74 20 74 68 65 72 65 20 75 73 69 6e 67 20 73  et there using s
2bd80 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2bd90 29 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  ) rather than a 
2bda0 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 62 69  full.      ** bi
2bdb0 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20 54 68  nary search.  Th
2bdc0 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
2bdd0 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54 68 65  ation only.  The
2bde0 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 0a   correct answer.
2bdf0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
2be00 6c 20 6f 62 74 61 69 6e 65 64 20 77 69 74 68 6f  l obtained witho
2be10 75 74 20 74 68 69 73 20 63 61 73 65 2c 20 6f 6e  ut this case, on
2be20 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72 65  ly a little more
2be30 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20 20 20   slowely */.    
2be40 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
2be50 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65 79 20  .nKey+1==intKey 
2be60 26 26 20 21 70 43 75 72 2d 3e 73 6b 69 70 4e 65  && !pCur->skipNe
2be70 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  xt ){.        *p
2be80 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2be90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2bea0 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b  eeNext(pCur, 0);
2beb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2bec0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bed0 20 20 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49          getCellI
2bee0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20  nfo(pCur);.     
2bef0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2bf00 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
2bf10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2bf20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2bf30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2bf40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2bf50 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
2bf60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2bf70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2bf80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bf90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2bfa0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2bfb0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2bfc0 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20  if( pIdxKey ){. 
2bfd0 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
2bfe0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46  e = sqlite3VdbeF
2bff0 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b  indCompare(pIdxK
2c000 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  ey);.    pIdxKey
2c010 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
2c020 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b     assert( pIdxK
2c030 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2c040 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  1 .         || p
2c050 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2c060 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  rc==0 .         
2c070 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
2c080 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29  ult_rc==-1.    )
2c090 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
2c0a0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
2c0b0 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61  0; /* All keys a
2c0c0 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20  re integers */. 
2c0d0 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
2c0e0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
2c0f0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2c100 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2c110 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2c120 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2c130 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2c140 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
2c150 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2c160 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2c170 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2c180 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
2c190 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2c1a0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2c1b0 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  ID || pCur->apPa
2c1c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2c1d0 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66  >nCell>0 );.  if
2c1e0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2c1f0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
2c200 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
2c210 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2c220 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2c230 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2c240 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2c250 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
2c260 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c270 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2c280 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
2c290 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72  ntKey==pCur->cur
2c2a0 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  IntKey );.  asse
2c2b0 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
2c2c0 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
2c2d0 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
2c2e0 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
2c2f0 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
2c300 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
2c310 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2c320 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2c330 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a  iPage];.    u8 *
2c340 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
2c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c360 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
2c370 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
2c380 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70  age */..    /* p
2c390 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
2c3a0 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
2c3b0 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
2c3c0 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
2c3d0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
2c3e0 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
2c3f0 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
2c400 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
2c410 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
2c420 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
2c430 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
2c440 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
2c450 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
2c460 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
2c470 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
2c480 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
2c490 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
2c4a0 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
2c4b0 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
2c4c0 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
2c4d0 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
2c4e0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
2c4f0 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
2c500 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
2c510 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
2c520 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
2c530 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
2c540 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2c550 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2c560 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2c570 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
2c580 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
2c590 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
2c5a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
2c5b0 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52     assert( biasR
2c5c0 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52  ight==0 || biasR
2c5d0 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69  ight==1 );.    i
2c5e0 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61  dx = upr>>(1-bia
2c5f0 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20  sRight); /* idx 
2c600 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70  = biasRight ? up
2c610 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  r : (lwr+upr)/2;
2c620 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69 78   */.    pCur->ix
2c630 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2c640 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70   if( xRecordComp
2c650 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  are==0 ){.      
2c660 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2c670 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
2c680 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
2c690 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70  indCellPastPtr(p
2c6a0 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
2c6b0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2c6c0 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
2c6d0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78         while( 0x
2c6e0 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  80 <= *(pCell++)
2c6f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c700 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65  if( pCell>=pPage
2c710 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20 20  ->aDataEnd ){.  
2c720 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2c730 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2c740 54 5f 50 47 4e 4f 28 70 50 61 67 65 2d 3e 70 67  T_PGNO(pPage->pg
2c750 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  no);.           
2c760 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2c770 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c780 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c   getVarint(pCell
2c790 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65  , (u64*)&nCellKe
2c7a0 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
2c7b0 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20  nCellKey<intKey 
2c7c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
2c7d0 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
2c7e0 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2c7f0 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b  ){ c = -1; break
2c800 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
2c810 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69  e if( nCellKey>i
2c820 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2c830 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
2c840 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2c850 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b  r>upr ){ c = +1;
2c860 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2c870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c880 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
2c890 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20  Key==intKey );. 
2c8a0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2c8b0 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
2c8c0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2c8d0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2c8e0 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2c8f0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  x;.            g
2c900 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f  oto moveto_next_
2c910 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20  layer;.         
2c920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c930 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2c940 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
2c950 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  NKey;.          
2c960 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
2c970 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
2c980 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2c990 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
2c9b0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
2c9c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c9d0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
2c9e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c9f0 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75     assert( lwr+u
2ca00 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr>=0 );.       
2ca10 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2ca20 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28  >>1;  /* idx = (
2ca30 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
2ca40 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2ca50 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
2ca60 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65  .        int nCe
2ca70 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  ll;  /* Size of 
2ca80 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69  the pCell cell i
2ca90 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
2caa0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2cab0 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65  ellPastPtr(pPage
2cac0 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20  , idx);..       
2cad0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
2cae0 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73  supported page-s
2caf0 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74  ize is 65536 byt
2cb00 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  es. This means t
2cb10 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hat.        ** t
2cb20 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
2cb30 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65  r of record byte
2cb40 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69  s stored on an i
2cb50 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20  ndex B-Tree.    
2cb60 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c      ** page is l
2cb70 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62  ess than 16384 b
2cb80 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20  ytes and may be 
2cb90 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79  stored as a 2-by
2cba0 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  te.        ** va
2cbb0 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72  rint. This infor
2cbc0 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
2cbd0 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f  o attempt to avo
2cbe0 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20  id parsing .    
2cbf0 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
2cc00 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69  e cell by checki
2cc10 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73  ng for the cases
2cc20 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72   where the recor
2cc30 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  d is .        **
2cc40 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79   stored entirely
2cc50 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72   within the b-tr
2cc60 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65  ee page by inspe
2cc70 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  cting the first 
2cc80 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79  .        ** 2 by
2cc90 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  tes of the cell.
2cca0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2ccb0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c      nCell = pCel
2ccc0 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
2ccd0 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  ( nCell<=pPage->
2cce0 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
2ccf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2cd00 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
2cd10 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73   if the record-s
2cd20 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
2cd30 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20   cell is a.     
2cd40 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62       ** single b
2cd50 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
2cd60 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65  he record fits e
2cd70 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
2cd80 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ain.          **
2cd90 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
2cda0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2cdb0 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
2cdc0 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+1==pPage->aDat
2cdd0 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
2cde0 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2cdf0 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
2ce00 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
2ce10 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2ce20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
2ce30 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
2ce40 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
2ce50 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
2ce60 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
2ce70 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
2ce80 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  al.        ){.  
2ce90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2cea0 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
2ceb0 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72   is a 2 byte var
2cec0 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
2ced0 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rd .          **
2cee0 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
2cef0 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65  n the main b-tre
2cf00 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
2cf10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2cf20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70  pCell+nCell+2==p
2cf30 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
2cf40 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
2cf50 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
2cf60 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
2cf70 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29  ell[2], pIdxKey)
2cf80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2cf90 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2cfa0 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
2cfb0 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
2cfc0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
2cfd0 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
2cfe0 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
2cff0 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
2d000 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
2d010 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
2d020 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
2d030 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
2d040 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
2d050 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
2d060 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
2d070 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
2d080 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
2d090 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
2d0a0 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20   called. .      
2d0b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
2d0c0 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72   ** If the recor
2d0d0 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68  d is corrupt, th
2d0e0 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  e xRecordCompare
2d0f0 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61   routine may rea
2d100 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  d.          ** u
2d110 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73  p to two varints
2d120 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
2d130 20 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20   the buffer. An 
2d140 65 78 74 72 61 20 31 38 20 0a 20 20 20 20 20 20  extra 18 .      
2d150 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
2d160 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63  padding is alloc
2d170 61 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ated at the end 
2d180 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69 6e  of the buffer in
2d190 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
2d1a0 73 65 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e  se this happens.
2d1b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76    */.          v
2d1c0 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20  oid *pCellKey;. 
2d1d0 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f           u8 * co
2d1e0 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20  nst pCellBody = 
2d1f0 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63  pCell - pPage->c
2d200 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
2d210 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50         pPage->xP
2d220 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
2d230 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72  pCellBody, &pCur
2d240 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ->info);.       
2d250 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29     nCell = (int)
2d260 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
2d270 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2d280 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20  ase( nCell<0 ); 
2d290 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79    /* True if key
2d2a0 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72   size is 2^32 or
2d2b0 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20   more */.       
2d2c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2d2d0 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76  ll==0 );  /* Inv
2d2e0 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20  alid key size:  
2d2f0 30 78 38 30 20 30 78 38 30 20 30 78 30 30 20 2a  0x80 0x80 0x00 *
2d300 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2d310 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29  case( nCell==1 )
2d320 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65  ;  /* Invalid ke
2d330 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78  y size:  0x80 0x
2d340 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20  80 0x01 */.     
2d350 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2d360 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d  Cell==2 );  /* M
2d370 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64  inimum legal ind
2d380 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20  ex key size */. 
2d390 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65           if( nCe
2d3a0 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ll<2 ){.        
2d3b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2d3c0 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
2d3d0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
2d3e0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2d3f0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2d400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d410 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
2d420 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
2d430 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20  +18 );.         
2d440 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
2d450 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d460 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2d470 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
2d480 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2d490 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2d4a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
2d4b0 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
2d4c0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  x;.          rc 
2d4d0 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
2d4e0 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
2d4f0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2d500 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20  pCellKey, 0);.  
2d510 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
2d520 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
2d530 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20  ValidOvfl;.     
2d540 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2d550 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2d560 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
2d570 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
2d580 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2d590 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2d5a0 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2d5b0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2d5c0 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  l, pCellKey, pId
2d5d0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
2d5e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2d5f0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2d600 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2d610 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t( .            
2d620 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
2d630 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e!=SQLITE_CORRUP
2d640 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20  T || c==0).     
2d650 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d      && (pIdxKey-
2d660 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2d670 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e  _NOMEM || pCur->
2d680 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pBtree->db->mall
2d690 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20  ocFailed).      
2d6a0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
2d6b0 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
2d6c0 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
2d6d0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2d6e0 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c>0 ){.        
2d6f0 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
2d700 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2d710 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d720 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
2d730 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2d740 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2d750 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2d760 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2d770 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2d780 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72  if( pIdxKey->err
2d790 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49  Code ) rc = SQLI
2d7a0 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
2d7b0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2d7c0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2d7d0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2d7e0 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b  lwr>upr ) break;
2d7f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d800 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2d810 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2d820 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2d830 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2d840 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2d850 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
2d860 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61  r==upr+1 || (pPa
2d870 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
2d880 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20  Page->leaf) );. 
2d890 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2d8a0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
2d8b0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2d8c0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2d8d0 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e   pCur->ix<pCur->
2d8e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2d8f0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
2d900 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2d910 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a  u16)idx;.      *
2d920 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
2d930 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2d940 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2d950 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
2d960 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2d970 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d  r:.    if( lwr>=
2d980 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2d990 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
2d9a0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2d9b0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2d9c0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2d9d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
2d9e0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
2d9f0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
2da00 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
2da10 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
2da20 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  lwr;.    rc = mo
2da30 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2da40 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
2da50 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d   rc ) break;.  }
2da60 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
2da70 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2da80 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ze = 0;.  assert
2da90 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2daa0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
2dab0 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  fl)==0 );.  retu
2dac0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2dad0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2dae0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
2daf0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2db00 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
2db10 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
2db20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
2db30 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
2db40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2db50 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
2db60 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
2db70 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
2db80 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2db90 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
2dba0 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
2dbb0 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
2dbc0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2dbd0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2dbe0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2dbf0 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
2dc00 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
2dc10 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
2dc20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
2dc30 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2dc40 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
2dc50 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
2dc60 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
2dc70 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
2dc80 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
2dc90 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
2dca0 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
2dcb0 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
2dcc0 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
2dcd0 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
2dce0 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
2dcf0 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
2dd00 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 73 74 69  * Return an esti
2dd10 6d 61 74 65 20 66 6f 72 20 74 68 65 20 6e 75 6d  mate for the num
2dd20 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
2dd30 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 70 43  he table that pC
2dd40 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e  ur is.** pointin
2dd50 67 20 74 6f 2e 20 20 52 65 74 75 72 6e 20 61 20  g to.  Return a 
2dd60 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20  negative number 
2dd70 69 66 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 69  if no estimate i
2dd80 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20  s currently .** 
2dd90 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36  available..*/.i6
2dda0 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  4 sqlite3BtreeRo
2ddb0 77 43 6f 75 6e 74 45 73 74 28 42 74 43 75 72 73  wCountEst(BtCurs
2ddc0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 36 34  or *pCur){.  i64
2ddd0 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61   n;.  u8 i;..  a
2dde0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2ddf0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2de00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2de10 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2de20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2de30 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
2de40 2a 20 43 75 72 72 65 6e 74 6c 79 20 74 68 69 73  * Currently this
2de50 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 6f 6e   interface is on
2de60 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  ly called by the
2de70 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20   OP_IfSmaller.  
2de80 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69  ** opcode, and i
2de90 74 20 74 68 61 74 20 63 61 73 65 20 74 68 65 20  t that case the 
2dea0 63 75 72 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61  cursor will alwa
2deb0 79 73 20 62 65 20 76 61 6c 69 64 20 61 6e 64 0a  ys be valid and.
2dec0 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73    ** will always
2ded0 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c 65 61 66   point to a leaf
2dee0 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20   node. */.  if( 
2def0 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61  NEVER(pCur->eSta
2df00 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2df10 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  ) ) return -1;. 
2df20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
2df30 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2df40 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 29 20 29  age]->leaf==0) )
2df50 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 66   return -1;..  f
2df60 6f 72 28 6e 3d 31 2c 20 69 3d 30 3b 20 69 3c 3d  or(n=1, i=0; i<=
2df70 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
2df80 29 7b 0a 20 20 20 20 6e 20 2a 3d 20 70 43 75 72  ){.    n *= pCur
2df90 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65  ->apPage[i]->nCe
2dfa0 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ll;.  }.  return
2dfb0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76   n;.}../*.** Adv
2dfc0 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
2dfd0 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
2dfe0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2dff0 65 2e 20 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61  e. .** Return va
2e000 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51  lue:.**.**    SQ
2e010 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 73  LITE_OK        s
2e020 75 63 63 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c  uccess.**    SQL
2e030 49 54 45 5f 44 4f 4e 45 20 20 20 20 20 20 63 75  ITE_DONE      cu
2e040 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
2e050 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
2e060 6c 61 73 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  last element.** 
2e070 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20     otherwise    
2e080 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66      some kind of
2e090 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a   error occurred.
2e0a0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
2e0b0 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
2e0c0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2e0d0 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2e0e0 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2e0f0 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2e100 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e  ase of merely in
2e110 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2e120 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2e130 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2e140 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f   the next cell o
2e150 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
2e160 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
2e170 29 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65  ) btreeNext() he
2e180 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  lper.** routine 
2e190 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69  is called when i
2e1a0 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
2e1b0 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66  o move to a diff
2e1c0 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a  erent page or.**
2e1d0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2e1e0 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  cursor..**.** If
2e1f0 20 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65   bit 0x01 of the
2e200 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20   flags argument 
2e210 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65 20 63  is 1, then the c
2e220 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64  ursor correspond
2e230 73 20 74 6f 0a 2a 2a 20 61 6e 20 53 51 4c 20 69  s to.** an SQL i
2e240 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f  ndex and this ro
2e250 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2e260 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
2e270 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78 0a 2a   the SQL index.*
2e280 2a 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69  * had been a uni
2e290 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  que index.  The 
2e2a0 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
2e2b0 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
2e2c0 69 6d 70 6c 65 6d 65 6e 74 2e 0a 2a 2a 20 53 51  implement..** SQ
2e2d0 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2e2e0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2e2f0 6f 74 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  ot use this hint
2e300 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65  , but COMDB2 doe
2e310 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  s..*/.static SQL
2e320 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2e330 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72   btreeNext(BtCur
2e340 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66  sor *pCur, int f
2e350 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
2e360 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
2e370 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
2e380 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2e390 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2e3a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2e3b0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
2e3c0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2e3d0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2e3e0 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
2e3f0 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  s==0 );.  if( pC
2e400 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2e410 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2e420 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2e430 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2e440 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a  alidOvfl)==0 );.
2e450 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65      rc = restore
2e460 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2e470 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Cur);.    if( rc
2e480 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e490 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2e4a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55      }.    if( CU
2e4b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
2e4c0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
2e4d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e4e0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
2e4f0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2e500 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
2e510 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2e520 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2e530 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2e540 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
2e550 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
2e560 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2e570 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
2e580 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2e590 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  >0 ){.        pC
2e5a0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2e5b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2e5c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2e5d0 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
2e5e0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2e5f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
2e600 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2e610 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2e620 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 69 78  idx = ++pCur->ix
2e630 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2e640 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20  e->isInit );..  
2e650 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2e660 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  se file is corru
2e670 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  pt, it is possib
2e680 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  le for the value
2e690 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f   of idx .  ** to
2e6a0 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65   be invalid here
2e6b0 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
2e6c0 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e  occur if a secon
2e6d0 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65  d cursor modifie
2e6e0 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  s.  ** the page 
2e6f0 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75  while cursor pCu
2e700 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72  r is holding a r
2e710 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20  eference to it. 
2e720 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f  Which can.  ** o
2e730 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
2e740 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
2e750 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20  rrupt in such a 
2e760 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74  way as to link t
2e770 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74  he.  ** page int
2e780 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2e790 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
2e7a0 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  . */.  testcase(
2e7b0 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c   idx>pPage->nCel
2e7c0 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e  l );..  if( idx>
2e7d0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2e7e0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2e7f0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
2e800 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2e810 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
2e820 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2e830 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2e840 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
2e850 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2e860 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2e870 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2e880 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
2e890 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2e8a0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
2e8b0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2e8c0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2e8d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2e8e0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
2e8f0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
2e900 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
2e910 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
2e920 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2e930 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
2e940 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3e 3d 70  ile( pCur->ix>=p
2e950 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2e960 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2e970 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
2e980 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65  turn sqlite3Btre
2e990 65 4e 65 78 74 28 70 43 75 72 2c 20 66 6c 61 67  eNext(pCur, flag
2e9a0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
2e9b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e9c0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
2e9d0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
2e9e0 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
2e9f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2ea00 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2ea10 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2ea20 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20  Cur);.  }.}.int 
2ea30 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2ea40 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2ea50 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 4d   int flags){.  M
2ea60 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
2ea70 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2ea80 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2ea90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ) );.  assert( f
2eaa0 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
2eab0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
2eac0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2ead0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2eae0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2eaf0 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
2eb00 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2eb10 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2eb20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2eb30 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2eb40 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2eb50 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2eb60 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65  ID ) return btre
2eb70 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a  eNext(pCur, 0);.
2eb80 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2eb90 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2eba0 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43  ge];.  if( (++pC
2ebb0 75 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e  ur->ix)>=pPage->
2ebc0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75  nCell ){.    pCu
2ebd0 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74  r->ix--;.    ret
2ebe0 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
2ebf0 75 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  ur, 0);.  }.  if
2ec00 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2ec10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2ec20 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2ec30 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2ec40 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2ec50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74  .  }.}../*.** St
2ec60 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
2ec70 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
2ec80 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
2ec90 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2eca0 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65  .** Return value
2ecb0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  s:.**.**     SQL
2ecc0 49 54 45 5f 4f 4b 20 20 20 20 20 73 75 63 63 65  ITE_OK     succe
2ecd0 73 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  ss.**     SQLITE
2ece0 5f 44 4f 4e 45 20 20 20 74 68 65 20 63 75 72 73  _DONE   the curs
2ecf0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 6f 6e  or is already on
2ed00 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65   the first eleme
2ed10 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a  nt of the table.
2ed20 2a 2a 20 20 20 20 20 6f 74 68 65 72 77 69 73 65  **     otherwise
2ed30 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f       some kind o
2ed40 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  f error occurred
2ed50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
2ed60 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73  entry point is s
2ed70 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2ed80 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75  ous().  That rou
2ed90 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65  tine is optimize
2eda0 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d  d.** for the com
2edb0 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65  mon case of mere
2edc0 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20  ly decrementing 
2edd0 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72  the cell counter
2ede0 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a   BtCursor.aiIdx.
2edf0 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ** to the previo
2ee00 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63  us cell on the c
2ee10 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68  urrent page.  Th
2ee20 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65  e (slower) btree
2ee30 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65  Previous().** he
2ee40 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20  lper routine is 
2ee50 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
2ee60 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
2ee70 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
2ee80 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f  nt page.** or to
2ee90 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
2eea0 73 6f 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 66  sor..**.**.** If
2eeb0 20 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65   bit 0x01 of the
2eec0 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20   flags argument 
2eed0 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65 20 63  is 1, then the c
2eee0 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64  ursor correspond
2eef0 73 20 74 6f 0a 2a 2a 20 61 6e 20 53 51 4c 20 69  s to.** an SQL i
2ef00 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f  ndex and this ro
2ef10 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2ef20 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
2ef30 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78 0a 2a   the SQL index.*
2ef40 2a 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69  * had been a uni
2ef50 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  que index.  The 
2ef60 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
2ef70 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
2ef80 69 6d 70 6c 65 6d 65 6e 74 2e 0a 2a 2a 20 53 51  implement..** SQ
2ef90 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2efa0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2efb0 6f 74 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  ot use this hint
2efc0 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65  , but COMDB2 doe
2efd0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  s..*/.static SQL
2efe0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2eff0 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 42   btreePrevious(B
2f000 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2f010 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
2f020 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
2f030 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2f040 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2f050 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2f060 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
2f070 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2f080 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2f090 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2f0a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2f0b0 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
2f0c0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
2f0d0 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
2f0e0 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
2f0f0 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a  lidNKey))==0 );.
2f100 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2f110 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
2f120 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2f130 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2f140 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  D ){.    rc = re
2f150 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2f160 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
2f170 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f180 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2f190 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
2f1a0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
2f1b0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2f1c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2f1d0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
2f1e0 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
2f1f0 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20  >skipNext ){.   
2f200 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2f210 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2f220 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
2f230 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
2f240 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20  IPNEXT );.      
2f250 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2f260 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
2f270 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2f280 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20  pNext<0 ){.     
2f290 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2f2a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2f2b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f2c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2f2d0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2f2e0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
2f2f0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2f300 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2f310 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
2f320 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2f330 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2f340 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20   ){.    int idx 
2f350 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20  = pCur->ix;.    
2f360 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2f370 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
2f380 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2f390 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20  idx)));.    if( 
2f3a0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2f3b0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
2f3c0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
2f3d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
2f3e0 6c 65 28 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20  le( pCur->ix==0 
2f3f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
2f400 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
2f410 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
2f420 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2f430 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
2f440 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
2f450 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f460 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
2f470 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  r);.    }.    as
2f480 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2f490 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  .nSize==0 );.   
2f4a0 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2f4b0 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46  curFlags & (BTCF
2f4c0 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20  _ValidOvfl))==0 
2f4d0 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 69 78  );..    pCur->ix
2f4e0 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  --;.    pPage = 
2f4f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2f500 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
2f510 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2f520 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2f530 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2f540 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
2f550 6f 75 73 28 70 43 75 72 2c 20 66 6c 61 67 73 29  ous(pCur, flags)
2f560 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2f570 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2f580 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
2f590 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
2f5a0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2f5b0 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
2f5c0 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  Cur, int flags){
2f5d0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2f5e0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2f5f0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2f600 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
2f610 67 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  gs==1 );.  asser
2f620 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2f630 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
2f640 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2f650 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75  ID );.  pCur->cu
2f660 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2f670 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2f680 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
2f690 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  dNKey);.  pCur->
2f6a0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2f6b0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2f6c0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2f6d0 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d  .   || pCur->ix=
2f6e0 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61  =0.   || pCur->a
2f6f0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2f700 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b  e]->leaf==0.  ){
2f710 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
2f720 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
2f730 30 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  0);.  }.  pCur->
2f740 69 78 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53  ix--;.  return S
2f750 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2f760 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
2f770 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
2f780 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2f790 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
2f7a0 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
2f7b0 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
2f7c0 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
2f7d0 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
2f7e0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2f7f0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
2f800 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
2f810 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
2f820 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
2f830 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
2f840 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
2f850 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
2f860 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
2f870 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
2f880 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
2f890 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
2f8a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2f8b0 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
2f8c0 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
2f8d0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
2f8e0 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
2f8f0 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73  ror.  *ppPage is
2f900 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20   set to NULL in 
2f910 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
2f920 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
2f930 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
2f940 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
2f950 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20   then an effort 
2f960 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
2f970 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
2f980 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
2f990 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
2f9a0 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
2f9b0 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
2f9c0 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
2f9d0 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
2f9e0 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
2f9f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2fa00 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
2fa10 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
2fa20 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
2fa30 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
2fa40 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  e eMode paramete
2fa50 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41  r is BTALLOC_EXA
2fa60 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62  CT and the nearb
2fa70 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a  y page exists.**
2fa80 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
2fa90 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
2faa0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2fab0 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
2fac0 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69  .  If.** eMode i
2fad0 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65  s BTALLOC_LT the
2fae0 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72  n the page retur
2faf0 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73  ned will be less
2fb00 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
2fb10 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61  * to nearby if a
2fb20 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69  ny such page exi
2fb30 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69  sts.  If eMode i
2fb40 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68  s BTALLOC_ANY th
2fb50 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  en there.** are 
2fb60 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  no restrictions 
2fb70 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73  on which page is
2fb80 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2fb90 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
2fba0 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
2fbb0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
2fbc0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
2fbd0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
2fbe0 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a  *ppPage,      /*
2fbf0 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74   Store pointer t
2fc00 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
2fc10 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50  page here */.  P
2fc20 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20  gno *pPgno,     
2fc30 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
2fc40 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68  he page number h
2fc50 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  ere */.  Pgno ne
2fc60 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20  arby,           
2fc70 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  /* Search for a 
2fc80 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f  page near this o
2fc90 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65  ne */.  u8 eMode
2fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fcb0 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c  * BTALLOC_EXACT,
2fcc0 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20   BTALLOC_LT, or 
2fcd0 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29  BTALLOC_ANY */.)
2fce0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2fcf0 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
2fd00 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
2fd10 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
2fd20 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
2fd30 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
2fd40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
2fd50 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
2fd60 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
2fd70 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
2fd80 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
2fd90 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
2fda0 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
2fdb0 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
2fdc0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2fdd0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
2fde0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2fdf0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2fe00 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2fe10 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  ert( eMode==BTAL
2fe20 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72  LOC_ANY || (near
2fe30 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69  by>0 && IfNotOmi
2fe40 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  tAV(pBt->autoVac
2fe50 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65  uum)) );.  pPage
2fe60 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
2fe70 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65  .  mxPage = btre
2fe80 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
2fe90 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
2fea0 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37  F: R-05119-02637
2feb0 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d   The 4-byte big-
2fec0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61  endian integer a
2fed0 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a  t offset 36.  **
2fee0 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74   stores stores t
2fef0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
2ff00 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
2ff10 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e  freelist. */.  n
2ff20 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2ff30 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
2ff40 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
2ff50 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66  mxPage-1 );.  if
2ff60 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20  ( n>=mxPage ){. 
2ff70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2ff80 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2ff90 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a   }.  if( n>0 ){.
2ffa0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
2ffb0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
2ffc0 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f  eelist.  Reuse o
2ffd0 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
2ffe0 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  s. */.    Pgno i
2fff0 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65  Trunk;.    u8 se
30000 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
30010 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
30020 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
30030 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
30040 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72  */.    u32 nSear
30050 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75  ch = 0;   /* Cou
30060 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
30070 20 6f 66 20 73 65 61 72 63 68 20 61 74 74 65 6d   of search attem
30080 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  pts */.    .    
30090 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41  /* If eMode==BTA
300a0 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61  LLOC_EXACT and a
300b0 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f   query of the po
300c0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a  inter-map.    **
300d0 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20   shows that the 
300e0 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
300f0 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68   somewhere on th
30100 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
30110 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74  n.    ** the ent
30120 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ire-list will be
30130 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
30140 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  at page..    */.
30150 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30160 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
30170 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54     if( eMode==BT
30180 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20  ALLOC_EXACT ){. 
30190 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c       if( nearby<
301a0 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  =mxPage ){.     
301b0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
301c0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61       assert( nea
301d0 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  rby>0 );.       
301e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
301f0 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
30200 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
30210 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
30220 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
30230 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
30240 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
30250 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
30260 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
30270 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
30280 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  st = 1;.        
30290 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
302a0 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42  lse if( eMode==B
302b0 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
302c0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
302d0 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
302e0 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
302f0 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  t the free-list 
30300 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20  count by 1. Set 
30310 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e  iTrunk to the in
30320 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  dex of the.    *
30330 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73  * first free-lis
30340 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50  t trunk page. iP
30350 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74  revTrunk is init
30360 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a  ially 1..    */.
30370 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30380 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
30390 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
303a0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
303b0 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74   rc;.    put4byt
303c0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
303d0 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20  [36], n-1);..   
303e0 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74   /* The code wit
303f0 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  hin this loop is
30400 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69   run only once i
30410 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73  f the 'searchLis
30420 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  t' variable.    
30430 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20  ** is not true. 
30440 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75  Otherwise, it ru
30450 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
30460 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74   trunk-page on t
30470 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c  he.    ** free-l
30480 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61  ist until the pa
30490 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  ge 'nearby' is l
304a0 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
304b0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20  TALLOC_EXACT).  
304c0 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20    ** or until a 
304d0 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27  page less than '
304e0 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
304f0 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
30500 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20  OC_LT).    */.  
30510 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72    do {.      pPr
30520 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b  evTrunk = pTrunk
30530 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
30540 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
30550 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
30560 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20  : R-01506-11053 
30570 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65  The first intege
30580 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20  r on a freelist 
30590 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20  trunk page.     
305a0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67     ** is the pag
305b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
305c0 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74 72  next freelist tr
305d0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
305e0 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20  list or.        
305f0 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20  ** zero if this 
30600 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65 65  is the last free
30610 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
30620 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75   */.        iTru
30630 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
30640 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
30650 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
30660 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  e{.        /* EV
30670 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38  IDENCE-OF: R-598
30680 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62  41-13798 The 4-b
30690 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
306a0 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
306b0 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   32.        ** s
306c0 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20 6e  tores the page n
306d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
306e0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
306f0 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f  reelist, or zero
30700 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   if.        ** t
30710 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
30720 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  mpty. */.       
30730 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
30740 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
30750 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  a[32]);.      }.
30760 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
30770 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29  iTrunk==mxPage )
30780 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75  ;.      if( iTru
30790 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65  nk>mxPage || nSe
307a0 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20  arch++ > n ){.  
307b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
307c0 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
307d0 50 72 65 76 54 72 75 6e 6b 20 3f 20 70 50 72 65  PrevTrunk ? pPre
307e0 76 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31  vTrunk->pgno : 1
307f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
30800 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
30810 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
30820 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
30830 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
30840 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
30850 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  {.        pTrunk
30860 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
30870 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
30880 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  page;.      }.  
30890 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75      assert( pTru
308a0 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  nk!=0 );.      a
308b0 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61  ssert( pTrunk->a
308c0 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20  Data!=0 );.     
308d0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
308e0 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54   R-13523-04394 T
308f0 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65  he second intege
30900 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20  r on a freelist 
30910 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20  trunk page.     
30920 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65   ** is the numbe
30930 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70  r of leaf page p
30940 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f  ointers to follo
30950 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20  w. */.      k = 
30960 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
30970 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
30980 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21     if( k==0 && !
30990 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20  searchList ){.  
309a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
309b0 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73  nk has no leaves
309c0 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73   and the list is
309d0 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63   not being searc
309e0 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  hed. .        **
309f0 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   So extract the 
30a00 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c  trunk page itsel
30a10 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20  f and use it as 
30a20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20  the newly .     
30a30 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
30a40 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
30a50 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75  assert( pPrevTru
30a60 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nk==0 );.       
30a70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
30a80 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
30a90 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
30aa0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
30ab0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
30ac0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
30ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30ae0 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
30af0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
30b00 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
30b10 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
30b20 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
30b30 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
30b40 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72  unk;.        pTr
30b50 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
30b60 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
30b70 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
30b80 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
30b90 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
30ba0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
30bb0 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d  if( k>(u32)(pBt-
30bc0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
30bd0 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  2) ){.        /*
30be0 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f   Value of k is o
30bf0 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61  ut of range.  Da
30c00 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
30c10 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  n */.        rc 
30c20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
30c30 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20  _PGNO(iTrunk);. 
30c40 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
30c50 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
30c60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30c70 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
30c80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
30c90 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
30ca0 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79        && (nearby
30cb0 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72  ==iTrunk || (iTr
30cc0 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  unk<nearby && eM
30cd0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
30ce0 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
30cf0 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
30d00 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
30d10 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
30d20 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
30d30 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
30d40 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
30d50 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
30d60 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
30d70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30d80 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
30d90 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  k;.        *ppPa
30da0 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
30db0 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
30dc0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
30dd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30de0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
30df0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
30e00 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
30e10 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
30e20 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
30e30 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
30e40 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
30e50 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
30e60 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
30e70 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
30e80 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
30e90 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
30ea0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
30eb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
30ec0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30ed0 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
30ee0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
30ef0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
30f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30f10 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
30f20 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
30f30 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
30f40 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
30f50 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
30f60 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
30f70 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
30f80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
30f90 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30fa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
30fb0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
30fc0 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
30fd0 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
30fe0 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
30ff0 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
31000 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
31010 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
31020 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
31030 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
31040 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
31050 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
31060 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
31070 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
31080 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
31090 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
310a0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
310b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
310c0 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
310d0 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
310e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
310f0 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b  RUPT_PGNO(iTrunk
31100 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
31110 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
31120 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
31130 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73   }.          tes
31140 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b  tcase( iNewTrunk
31150 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
31160 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
31170 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
31180 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
31190 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
311a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
311b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
311c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
311d0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
311e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
311f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31200 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
31210 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
31220 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
31230 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31240 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
31250 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
31260 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
31270 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
31280 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
31290 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
312a0 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
312b0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
312c0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
312d0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
312e0 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
312f0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
31300 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
31310 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
31320 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
31330 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
31340 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
31350 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
31360 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
31370 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
31380 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
31390 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
313a0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
313b0 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
313c0 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
313d0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
313e0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
313f0 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
31400 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31410 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
31420 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31430 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
31440 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
31450 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
31460 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
31470 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
31480 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
31490 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
314a0 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
314b0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
314c0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
314d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
314e0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
314f0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
31500 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
31510 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
31520 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
31530 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
31540 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  dif.      }else 
31550 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20  if( k>0 ){.     
31560 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
31570 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
31580 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  unk */.        u
31590 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  32 closest;.    
315a0 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
315b0 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
315c0 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
315d0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
315e0 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
315f0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
31600 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20  u32 i;.         
31610 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
31620 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64          if( eMod
31630 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
31640 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
31650 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
31660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
31670 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
31680 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a  &aData[8+i*4]);.
31690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
316a0 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20  ( iPage<=nearby 
316b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
316c0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
316d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
316f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31700 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
31710 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
31720 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20    int dist;.    
31730 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73          dist = s
31740 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
31750 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
31760 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
31770 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
31780 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
31790 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
317a0 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  d2 = sqlite3AbsI
317b0 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
317c0 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
317d0 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
317e0 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
317f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
31800 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
31810 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
31820 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
31830 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
31840 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31850 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
31860 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
31870 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
31880 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
31890 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
318a0 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
318b0 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  t*4]);.        t
318c0 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d  estcase( iPage==
318d0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
318e0 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61    if( iPage>mxPa
318f0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
31900 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
31910 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29  UPT_PGNO(iTrunk)
31920 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
31930 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
31940 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
31950 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
31960 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
31970 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
31980 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
31990 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65     || (iPage==ne
319a0 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e  arby || (iPage<n
319b0 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
319c0 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
319d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
319e0 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74     int noContent
319f0 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
31a00 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
31a10 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
31a20 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
31a30 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
31a40 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
31a50 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
31a60 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
31a70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
31a80 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
31a90 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
31aa0 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
31ab0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31ac0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31ad0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
31ae0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
31af0 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
31b00 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
31b10 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
31b20 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
31b30 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
31b40 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
31b50 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
31b60 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
31b70 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
31b80 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
31b90 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
31ba0 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74   noContent = !bt
31bb0 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
31bc0 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50  (pBt, *pPgno)? P
31bd0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
31be0 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  NT : 0;.        
31bf0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
31c00 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a  nusedPage(pBt, *
31c10 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
31c20 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
31c30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31c40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31c50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31c60 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
31c70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
31c80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
31c90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31ca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
31cb0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
31cc0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
31cd0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
31ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
31cf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31d00 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
31d10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
31d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
31d30 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
31d40 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
31d50 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
31d60 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
31d70 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
31d80 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
31d90 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
31da0 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70   freelist, so ap
31db0 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20  pend a new page 
31dc0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  to the.    ** da
31dd0 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20  tabase image..  
31de0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d    **.    ** Norm
31df0 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20  ally, new pages 
31e00 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
31e10 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72  s block can be r
31e20 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
31e30 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c  e.    ** pager l
31e40 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
31e50 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
31e60 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e  set. This preven
31e70 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ts the pager.   
31e80 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20   ** from trying 
31e90 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
31ea0 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  s content from d
31eb0 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  isk. However, if
31ec0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
31ed0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
31ee0 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20  has already run 
31ef0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72  one or more incr
31f00 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20  emental-vacuum. 
31f10 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65     ** steps, the
31f20 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  n the page we ar
31f30 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63  e about to alloc
31f40 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ate may contain 
31f50 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74  content.    ** t
31f60 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
31f70 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
31f80 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74  a rollback. In t
31f90 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20  his case, do.   
31fa0 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20   ** not set the 
31fb0 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e  no-content flag.
31fc0 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65   This causes the
31fd0 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61   pager to load a
31fe0 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nd journal.    *
31ff0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  * the current pa
32000 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72  ge content befor
32010 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74  e overwriting it
32020 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
32030 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
32040 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74  ger will not act
32050 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f  ually attempt to
32060 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c   load or journal
32070 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74   .    ** content
32080 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68   for any page th
32090 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c  at really does l
320a0 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ie past the end 
320b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
320c0 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64      ** file on d
320d0 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65  isk. So the effe
320e0 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67  cts of disabling
320f0 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
32100 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
32110 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e   ** here are con
32120 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70  fined to those p
32130 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65  ages that lie be
32140 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66  tween the end of
32150 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
32160 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74  base image and t
32170 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
32180 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
32190 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43   */.    int bNoC
321a0 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e  ontent = (0==IfN
321b0 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44  otOmitAV(pBt->bD
321c0 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47  oTruncate))? PAG
321d0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
321e0 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  :0;..    rc = sq
321f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
32200 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
32210 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
32220 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
32230 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
32240 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  .    if( pBt->nP
32250 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
32260 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42  E_PAGE(pBt) ) pB
32270 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66  t->nPage++;..#if
32280 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32290 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
322a0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
322b0 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
322c0 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
322d0 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Page) ){.      /
322e0 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
322f0 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
32300 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
32310 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
32320 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
32330 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
32340 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
32350 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
32360 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
32370 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
32380 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
32390 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
323a0 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
323b0 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
323c0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
323d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
323e0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
323f0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
32400 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
32410 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50  age)\n", pBt->nP
32420 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73  age));.      ass
32430 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ert( pBt->nPage!
32440 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
32450 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
32460 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
32470 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42  usedPage(pBt, pB
32480 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
32490 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
324a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
324b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
324c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
324d0 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
324e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
324f0 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
32500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
32510 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
32520 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
32530 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
32540 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
32550 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
32560 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65  t) ){ pBt->nPage
32570 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
32580 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  if.    put4byte(
32590 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70  28 + (u8*)pBt->p
325a0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42  Page1->aData, pB
325b0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a  t->nPage);.    *
325c0 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61  pPgno = pBt->nPa
325d0 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ge;..    assert(
325e0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
325f0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
32600 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
32610 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
32620 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
32630 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  ge, bNoContent);
32640 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
32650 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
32660 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32670 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
32680 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
32690 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
326a0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
326b0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
326c0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
326d0 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
326e0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
326f0 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
32700 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
32710 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
32720 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
32730 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
32740 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
32750 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
32760 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
32770 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
32780 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20  unk);.  assert( 
32790 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
327a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
327b0 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
327c0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31  ge)->pDbPage)<=1
327d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63   );.  assert( rc
327e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
327f0 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
32800 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
32810 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
32820 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
32830 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69  ed to add page i
32840 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  Page to the data
32850 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c  base file free-l
32860 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61  ist. .** It is a
32870 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
32880 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
32890 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68  ady a part of th
328a0 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
328b0 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  ** The value pas
328c0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
328d0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
328e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
328f0 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74  ptional..** If t
32900 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e  he caller happen
32910 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e  s to have a poin
32920 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
32930 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  ge object .** co
32940 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
32950 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c  age iPage handy,
32960 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20   it may pass it 
32970 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61  as the second va
32980 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  lue. .** Otherwi
32990 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  se, it may pass 
329a0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
329b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65   pointer to a Me
329c0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20  mPage object is 
329d0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
329e0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
329f0 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  * its reference 
32a00 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74  count is not alt
32a10 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
32a20 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
32a30 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42   int freePage2(B
32a40 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
32a50 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c  mPage *pMemPage,
32a60 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20   Pgno iPage){.  
32a70 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
32a80 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
32a90 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74      /* Free-list
32aa0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
32ab0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30   Pgno iTrunk = 0
32ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32ad0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
32ae0 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74  ber of free-list
32af0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a   trunk page */ .
32b00 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
32b10 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
32b20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72        /* Local r
32b30 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
32b40 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20   1 */.  MemPage 
32b50 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
32b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
32b70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e  age being freed.
32b80 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
32b90 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
32ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32bb0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
32bc0 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   Code */.  int n
32bd0 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
32be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32bf0 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
32c00 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65   of pages on fre
32c10 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
32c20 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
32c30 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
32c40 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
32c50 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
32c60 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65  Page>1 );.  asse
32c70 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c  rt( !pMemPage ||
32c80 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d   pMemPage->pgno=
32c90 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28  =iPage );..  if(
32ca0 20 69 50 61 67 65 3c 32 20 29 20 72 65 74 75 72   iPage<2 ) retur
32cb0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
32cc0 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65  _BKPT;.  if( pMe
32cd0 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
32ce0 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
32cf0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
32d00 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
32d10 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
32d20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
32d30 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
32d40 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
32d50 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
32d60 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
32d70 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
32d80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32d90 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
32da0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
32db0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
32dc0 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
32dd0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
32de0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
32df0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
32e00 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
32e10 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d  +1);..  if( pBt-
32e20 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
32e30 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
32e40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
32e50 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74  ecure_delete opt
32e60 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
32e70 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61  then.    ** alwa
32e80 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
32e90 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
32ea0 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
32eb0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
32ec0 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72  ( (!pPage && ((r
32ed0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
32ee0 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
32ef0 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20  age, 0))!=0) ). 
32f00 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20      ||          
32f10 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33    ((rc = sqlite3
32f20 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
32f30 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a  ->pDbPage))!=0).
32f40 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
32f50 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
32f60 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
32f70 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
32f80 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
32f90 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
32fa0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
32fb0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
32fc0 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
32fd0 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
32fe0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
32ff0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
33000 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
33010 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
33020 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
33030 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
33040 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
33050 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29  REEPAGE, 0, &rc)
33060 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
33070 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
33080 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
33090 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61  manipulate the a
330a0 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
330b0 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75  ree-list structu
330c0 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  re. There are tw
330d0 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69  o.  ** possibili
330e0 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65  ties. If the fre
330f0 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  e-list is curren
33100 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66  tly empty, or if
33110 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
33120 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
33130 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
33140 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ull, then this p
33150 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
33160 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d  a.  ** new free-
33170 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
33180 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77   Otherwise, it w
33190 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61  ill become a lea
331a0 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  f of the.  ** fi
331b0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
331c0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
331d0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c  ee-list. This bl
331e0 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a  ock tests if it.
331f0 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
33200 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65   to add the page
33210 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c   as a new free-l
33220 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20  ist leaf..  */. 
33230 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b   if( nFree!=0 ){
33240 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20  .    u32 nLeaf; 
33250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33260 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
33270 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f   of leaf cells o
33280 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  n trunk page */.
33290 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65  .    iTrunk = ge
332a0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
332b0 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
332c0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
332d0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
332e0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
332f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33300 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
33310 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
33320 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
33330 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
33340 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
33350 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
33360 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a  sableSize>32 );.
33370 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20      if( nLeaf > 
33380 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
33390 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
333a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
333b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
333c0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
333d0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
333e0 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33   if( nLeaf < (u3
333f0 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
33400 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
33410 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
33420 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f   there is room o
33430 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  n the trunk page
33440 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70   to insert the p
33450 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  age.      ** bei
33460 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65  ng freed as a ne
33470 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a  w leaf..      **
33480 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  .      ** Note t
33490 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  hat the trunk pa
334a0 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ge is not really
334b0 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63   full until it c
334c0 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
334d0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
334e0 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75  2 entries, not u
334f0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
33500 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61  entries as we ha
33510 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  ve.      ** code
33520 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61  d.  But due to a
33530 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e   coding error in
33540 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
33550 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  ite prior to.   
33560 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74     ** 3.6.0, dat
33570 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65  abases with free
33580 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73  list trunk pages
33590 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68   holding more th
335a0 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  an.      ** usab
335b0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
335c0 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70  ries will be rep
335d0 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74  orted as corrupt
335e0 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20  .  In order.    
335f0 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e    ** to maintain
33600 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
33610 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
33620 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
33630 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a  SQLite,.      **
33640 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
33650 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68  e to restrict th
33660 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
33670 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a  ies to usableSiz
33680 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a  e/4 - 8.      **
33690 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f   for now.  At so
336a0 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
336b0 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65  future (once eve
336c0 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64  ryone has upgrad
336d0 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33  ed.      ** to 3
336e0 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77  .6.0 or later) w
336f0 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65  e should conside
33700 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e  r fixing the con
33710 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20  ditional above. 
33720 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20       ** to read 
33730 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22  "usableSize/4-2"
33740 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61   instead of "usa
33750 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20  bleSize/4-8"..  
33760 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
33770 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
33780 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76  9920-11576 Howev
33790 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f  er, newer versio
337a0 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69  ns of SQLite sti
337b0 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69  ll.      ** avoi
337c0 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74  d using the last
337d0 20 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20   six entries in 
337e0 74 68 65 20 66 72 65 65 6c 69 73 74 20 74 72 75  the freelist tru
337f0 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20 69 6e  nk page array in
33800 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  .      ** order 
33810 74 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69  that database fi
33820 6c 65 73 20 63 72 65 61 74 65 64 20 62 79 20 6e  les created by n
33830 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
33840 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20   SQLite can be. 
33850 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20       ** read by 
33860 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
33870 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20  f SQLite..      
33880 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
33890 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
338a0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
338b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
338c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
338d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
338e0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
338f0 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20   nLeaf+1);.     
33900 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
33910 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65  unk->aData[8+nLe
33920 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20  af*4], iPage);. 
33930 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
33940 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
33950 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
33960 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20  DELETE)==0 ){.  
33970 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
33980 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
33990 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
339a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
339b0 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61   rc = btreeSetHa
339c0 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50  sContent(pBt, iP
339d0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
339e0 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
339f0 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
33a00 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
33a10 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
33a20 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
33a30 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
33a40 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
33a50 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
33a60 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
33a70 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20   point, then it 
33a80 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
33a90 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a   to add the.  **
33aa0 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
33ab0 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20  freed as a leaf 
33ac0 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73  page of the firs
33ad0 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
33ae0 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50  ree-list..  ** P
33af0 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
33b00 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
33b10 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69   empty, or possi
33b20 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
33b30 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
33b40 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
33b50 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68  st is full. Eith
33b60 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65  er way, the page
33b70 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a   being freed.  *
33b80 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * will become th
33b90 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e  e new first trun
33ba0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
33bb0 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  ee-list..  */.  
33bc0 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20  if( pPage==0 && 
33bd0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
33be0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
33bf0 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
33c00 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  , 0)) ){.    got
33c10 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
33c20 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
33c30 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
33c40 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
33c50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33c60 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  K ){.    goto fr
33c70 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
33c80 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
33c90 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29  ->aData, iTrunk)
33ca0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
33cb0 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
33cc0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
33cd0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
33ce0 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43  , iPage);.  TRAC
33cf0 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
33d00 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
33d10 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
33d20 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69  , pPage->pgno, i
33d30 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61  Trunk));..freepa
33d40 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50  ge_out:.  if( pP
33d50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
33d60 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
33d70 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
33d80 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  pPage);.  releas
33d90 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
33da0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
33db0 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61  atic void freePa
33dc0 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
33dd0 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  e, int *pRC){.  
33de0 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
33df0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
33e00 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50  C = freePage2(pP
33e10 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
33e20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
33e30 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
33e40 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
33e50 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
33e60 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
33e70 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  ll.  Write the.*
33e80 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a  * local Cell siz
33e90 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  e (the number of
33ea0 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72   bytes on the or
33eb0 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69  iginal page, omi
33ec0 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f  tting.** overflo
33ed0 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e  w) into *pnSize.
33ee0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
33ef0 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  learCell(.  MemP
33f00 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
33f10 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
33f20 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
33f30 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he Cell */.  uns
33f40 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
33f50 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  l,    /* First b
33f60 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20  yte of the Cell 
33f70 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
33f80 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20 2f 2a  Info          /*
33f90 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f   Size informatio
33fa0 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c  n about the cell
33fb0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
33fc0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
33fd0 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  pBt;.  Pgno ovfl
33fe0 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
33ff0 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75    int nOvfl;.  u
34000 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  32 ovflPageSize;
34010 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
34020 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
34030 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
34040 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  ) );.  pPage->xP
34050 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
34060 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
34070 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63   if( pInfo->nLoc
34080 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  al==pInfo->nPayl
34090 6f 61 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  oad ){.    retur
340a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
340b0 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
340c0 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
340d0 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
340e0 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  g */.  }.  if( p
340f0 43 65 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e 53 69 7a  Cell+pInfo->nSiz
34100 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  e-1 > pPage->aDa
34110 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
34120 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 65 6c  ge ){.    /* Cel
34130 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65  l extends past e
34140 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20  nd of page */.  
34150 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34160 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 61  CORRUPT_PGNO(pPa
34170 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ge->pgno);.  }. 
34180 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
34190 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e  byte(pCell + pIn
341a0 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a  fo->nSize - 4);.
341b0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
341c0 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
341d0 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
341e0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
341f0 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
34200 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
34210 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  d - pInfo->nLoca
34220 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
34230 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
34240 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  ze;.  assert( nO
34250 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43  vfl>0 || .    (C
34260 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28 70 49  ORRUPT_DB && (pI
34270 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2b 20  nfo->nPayload + 
34280 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76  ovflPageSize)<ov
34290 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b  flPageSize).  );
342a0 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
342b0 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
342c0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
342d0 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
342e0 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
342f0 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
34300 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
34310 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
34320 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
34330 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
34340 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
34350 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
34360 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
34370 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
34380 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
34390 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
343a0 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
343b0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
343c0 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
343d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
343e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
343f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
34400 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
34410 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
34420 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
34430 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
34440 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
34450 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
34460 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
34470 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
34480 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
34490 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
344a0 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
344b0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
344c0 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
344d0 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
344e0 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
344f0 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
34500 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
34510 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
34520 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
34530 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
34540 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
34550 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
34560 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
34570 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
34580 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
34590 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
345a0 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
345b0 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
345c0 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
345d0 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
345e0 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
345f0 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
34600 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
34610 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
34620 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
34630 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
34640 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
34650 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
34660 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
34670 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
34680 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
34690 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
346a0 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
346b0 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
346c0 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
346d0 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
346e0 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
346f0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
34700 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
34710 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
34720 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
34730 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
34740 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
34750 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
34760 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
34770 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
34780 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
34790 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
347a0 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
347b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
347c0 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
347d0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
347e0 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
347f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
34800 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
34810 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
34820 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
34830 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
34840 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
34850 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
34860 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
34870 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
34880 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
34890 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
348a0 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
348b0 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
348c0 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
348d0 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
348e0 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
348f0 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
34900 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
34910 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
34920 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
34930 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
34940 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
34950 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
34960 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
34970 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
34980 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
34990 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
349a0 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
349b0 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
349c0 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
349d0 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
349e0 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
349f0 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
34a00 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
34a10 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
34a20 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
34a30 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
34a40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34a50 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
34a60 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
34a70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34a80 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
34a90 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
34aa0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
34ab0 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
34ac0 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
34ad0 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
34ae0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74 72 65   */.  const Btre
34af0 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20 20 20  ePayload *pX,   
34b00 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20       /* Payload 
34b10 77 69 74 68 20 77 68 69 63 68 20 74 6f 20 63 6f  with which to co
34b20 6e 73 74 72 75 63 74 20 74 68 65 20 63 65 6c 6c  nstruct the cell
34b30 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
34b40 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
34b50 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
34b60 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
34b70 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
34b80 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
34b90 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
34ba0 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
34bb0 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
34bc0 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
34bd0 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
34be0 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
34bf0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
34c00 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
34c10 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
34c20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
34c30 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
34c40 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
34c50 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
34c60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
34c70 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
34c80 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
34c90 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20   );..  /* pPage 
34ca0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
34cb0 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e  ly writeable sin
34cc0 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62  ce pCell might b
34cd0 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
34ce0 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68   buffer space th
34cf0 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66  at is separate f
34d00 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75  rom the pPage bu
34d10 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61  ffer area */.  a
34d20 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61  ssert( pCell<pPa
34d30 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65  ge->aData || pCe
34d40 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ll>=&pPage->aDat
34d50 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
34d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
34d70 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
34d80 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
34d90 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
34da0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
34db0 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
34dc0 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  r = pPage->child
34dd0 50 74 72 53 69 7a 65 3b 0a 20 20 69 66 28 20 70  PtrSize;.  if( p
34de0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
34df0 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 70      nPayload = p
34e00 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d 3e 6e  X->nData + pX->n
34e10 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72 63 20 3d  Zero;.    pSrc =
34e20 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20   pX->pData;.    
34e30 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61 74 61  nSrc = pX->nData
34e40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
34e50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
34e60 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c  ); /* fillInCell
34e70 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  () only called f
34e80 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 20  or leaves */.   
34e90 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
34ea0 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
34eb0 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61  Header], nPayloa
34ec0 64 29 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20  d);.    nHeader 
34ed0 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
34ee0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
34ef0 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79 29 3b  u64*)&pX->nKey);
34f00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
34f10 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d  sert( pX->nKey<=
34f20 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70 58  0x7fffffff && pX
34f30 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20  ->pKey!=0 );.   
34f40 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f 61 64   nSrc = nPayload
34f50 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b 65 79   = (int)pX->nKey
34f60 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d  ;.    pSrc = pX-
34f70 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65 61 64  >pKey;.    nHead
34f80 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33  er += putVarint3
34f90 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  2(&pCell[nHeader
34fa0 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
34fb0 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  }.  .  /* Fill i
34fc0 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
34fd0 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
34fe0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
34ff0 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61   ){.    n = nHea
35000 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a  der + nPayload;.
35010 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
35020 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =3 );.    testca
35030 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  se( n==4 );.    
35040 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b  if( n<4 ) n = 4;
35050 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e  .    *pnSize = n
35060 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
35070 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
35080 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a  pPrior = pCell;.
35090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
350a0 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e   mn = pPage->min
350b0 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d  Local;.    n = m
350c0 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  n + (nPayload - 
350d0 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  mn) % (pPage->pB
350e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
350f0 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
35100 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
35110 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  ocal );.    test
35120 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  case( n==pPage->
35130 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
35140 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d    if( n > pPage-
35150 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20  >maxLocal ) n = 
35160 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66  mn;.    spaceLef
35170 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69  t = n;.    *pnSi
35180 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72  ze = n + nHeader
35190 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69 6f 72   + 4;.    pPrior
351a0 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
351b0 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79  r+n];.  }.  pPay
351c0 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
351d0 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74  eader];..  /* At
351e0 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69   this point vari
351f0 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20  ables should be 
35200 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  set as follows:.
35210 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79    **.  **   nPay
35220 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 54  load           T
35230 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a  otal payload siz
35240 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20  e in bytes.  ** 
35250 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20    pPayload      
35260 20 20 20 20 20 42 65 67 69 6e 20 77 72 69 74 69       Begin writi
35270 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a  ng payload here.
35280 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74    **   spaceLeft
35290 20 20 20 20 20 20 20 20 20 20 53 70 61 63 65 20            Space 
352a0 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61  available at pPa
352b0 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c  yload.  If nPayl
352c0 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20  oad>spaceLeft,. 
352d0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
352e0 20 20 20 20 20 20 20 20 20 74 68 61 74 20 6d 65           that me
352f0 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74  ans content must
35300 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72   spill into over
35310 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a  flow pages..  **
35320 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20     *pnSize      
35330 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68        Size of th
35340 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f  e local cell (no
35350 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66  t counting overf
35360 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20  low pages).  ** 
35370 20 20 70 50 72 69 6f 72 20 20 20 20 20 20 20 20    pPrior        
35380 20 20 20 20 20 57 68 65 72 65 20 74 6f 20 77 72       Where to wr
35390 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20  ite the pgno of 
353a0 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
353b0 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a  ow page.  **.  *
353c0 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20  * Use a call to 
353d0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
353e0 72 28 29 20 74 6f 20 76 65 72 69 66 79 20 74 68  r() to verify th
353f0 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 61 62  at the values ab
35400 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f  ove.  ** were co
35410 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79  mputed correctly
35420 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
35430 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20  LITE_DEBUG.  {. 
35440 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
35450 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
35460 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
35470 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
35480 20 20 61 73 73 65 72 74 28 20 6e 48 65 61 64 65    assert( nHeade
35490 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50  r==(int)(info.pP
354a0 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20  ayload - pCell) 
354b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
354c0 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b  nfo.nKey==pX->nK
354d0 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ey );.    assert
354e0 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66  ( *pnSize == inf
354f0 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  o.nSize );.    a
35500 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74  ssert( spaceLeft
35510 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20   == info.nLocal 
35520 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
35530 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
35540 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c  yload into the l
35550 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e  ocal Cell and an
35560 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65  y extra into ove
35570 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20  rflow pages */. 
35580 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
35590 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
355a0 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
355b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
355c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
355d0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
355e0 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
355f0 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
35600 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
35610 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
35620 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
35630 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
35640 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
35650 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
35660 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
35670 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
35680 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
35690 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
356a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
356b0 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
356c0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
356d0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
356e0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
356f0 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
35700 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
35710 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
35720 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
35730 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
35740 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
35750 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
35760 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
35770 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
35780 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
35790 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
357a0 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
357b0 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
357c0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
357d0 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
357e0 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
357f0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
35800 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
35810 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
35820 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
35830 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
35840 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
35850 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
35860 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
35870 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
35880 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
35890 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
358a0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
358b0 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
358c0 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
358d0 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
358e0 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
358f0 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lized values and
35900 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
35910 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
35920 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
35930 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
35940 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
35950 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
35960 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35970 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
35980 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
35990 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
359a0 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
359b0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
359c0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
359d0 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
359e0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
359f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
35a00 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
35a10 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
35a20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
35a30 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
35a40 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
35a50 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
35a60 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
35a70 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
35a80 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
35a90 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
35aa0 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
35ab0 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
35ac0 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
35ad0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
35ae0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
35af0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
35b00 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
35b10 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
35b20 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
35b30 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
35b40 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
35b50 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
35b60 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
35b70 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
35b80 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
35b90 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
35ba0 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
35bb0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
35bc0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
35bd0 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
35be0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
35bf0 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
35c00 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
35c10 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
35c20 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
35c30 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
35c40 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
35c50 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
35c60 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
35c70 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
35c80 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
35c90 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
35ca0 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
35cb0 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
35cc0 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
35cd0 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
35ce0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
35cf0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
35d00 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
35d10 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
35d20 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
35d30 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
35d40 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
35d50 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
35d60 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
35d70 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
35d80 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
35d90 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
35da0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
35db0 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
35dc0 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
35dd0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
35de0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
35df0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
35e00 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
35e10 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
35e20 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
35e30 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
35e40 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
35e50 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
35e60 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
35e70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
35e80 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
35e90 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
35ea0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
35eb0 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
35ec0 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
35ed0 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
35ee0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
35ef0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
35f00 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
35f10 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
35f20 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
35f30 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
35f40 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
35f50 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
35f60 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
35f70 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
35f80 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
35f90 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
35fa0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
35fb0 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
35fc0 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
35fd0 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
35fe0 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
35ff0 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
36000 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
36010 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 7d 0a  eLeft -= n;.  }.
36020 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
36030 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
36040 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
36050 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
36060 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
36070 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
36080 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
36090 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
360a0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
360b0 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
360c0 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
360d0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
360e0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
360f0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
36100 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
36110 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
36120 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
36130 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
36140 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
36150 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
36160 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
36170 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
36180 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
36190 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
361a0 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
361b0 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
361c0 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
361d0 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
361e0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
361f0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
36200 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
36210 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
36220 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
36230 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
36240 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
36250 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
36260 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
36270 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
36280 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
36290 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
362a0 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
362b0 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
362c0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
362d0 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
362e0 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
362f0 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
36300 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rn;.  assert( id
36310 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
36320 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
36330 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
36340 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65   || sz==cellSize
36350 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
36360 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
36370 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
36380 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
36390 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
363a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
363b0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
363c0 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
363d0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
363e0 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61   ptr = &pPage->a
363f0 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a  CellIdx[2*idx];.
36400 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
36410 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
36420 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
36430 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
36440 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
36450 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
36460 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
36470 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
36480 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20  ize );.  if( pc 
36490 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28  < (u32)get2byte(
364a0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c  &data[hdr+5]) ||
364b0 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e   pc+sz > pPage->
364c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
364d0 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
364e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
364f0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
36500 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
36510 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
36520 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  z);.  if( rc ){.
36530 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
36540 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
36550 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
36560 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
36570 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65  ell==0 ){.    me
36580 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
36590 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61  ], 0, 4);.    da
365a0 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
365b0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
365c0 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d  a[hdr+5], pPage-
365d0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
365e0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
365f0 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ree = pPage->pBt
36600 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70  ->usableSize - p
36610 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a  Page->hdrOffset.
36620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36630 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e         - pPage->
36640 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38  childPtrSize - 8
36650 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
36660 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b  emmove(ptr, ptr+
36670 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  2, 2*(pPage->nCe
36680 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20  ll - idx));.    
36690 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
366a0 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
366b0 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ell);.    pPage-
366c0 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d  >nFree += 2;.  }
366d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
366e0 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
366f0 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
36700 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
36710 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
36720 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
36730 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
36740 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
36750 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
36760 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
36770 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
36780 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
36790 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
367a0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
367b0 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
367c0 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
367d0 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
367e0 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
367f0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
36800 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
36810 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  >apOvfl[] and ma
36820 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
36830 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
36840 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
36850 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
36860 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
36870 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
36880 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
36890 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
368a0 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
368b0 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
368c0 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
368d0 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
368e0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52 43 20  ted..**.** *pRC 
368f0 6d 75 73 74 20 62 65 20 53 51 4c 49 54 45 5f 4f  must be SQLITE_O
36900 4b 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K when this rout
36910 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
36920 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
36930 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  sertCell(.  MemP
36940 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
36950 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68   Page into which
36960 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20   we are copying 
36970 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
36980 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
36990 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69  ll becomes the i
369a0 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  -th cell of the 
369b0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43  page */.  u8 *pC
369c0 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  ell,        /* C
369d0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
369e0 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  w cell */.  int 
369f0 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz,           /*
36a00 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   Bytes of conten
36a10 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  t in pCell */.  
36a20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20  u8 *pTemp,      
36a30 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
36a40 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c  e space for pCel
36a50 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  l, if needed */.
36a60 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20    Pgno iChild,  
36a70 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
36a80 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73  ro, replace firs
36a90 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  t 4 bytes with t
36aa0 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  his value */.  i
36ab0 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20  nt *pRC         
36ac0 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69   /* Read and wri
36ad0 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66  te return code f
36ae0 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  rom here */.){. 
36af0 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20   int idx = 0;   
36b00 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
36b10 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
36b20 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
36b30 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
36b40 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
36b50 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ounter */.  u8 *
36b60 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
36b70 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
36b80 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
36b90 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20 20  /.  u8 *pIns;   
36ba0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
36bb0 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  nt in pPage->aCe
36bc0 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f  llIdx[] where no
36bd0 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a   cell inserted *
36be0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  /..  assert( *pR
36bf0 43 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  C==SQLITE_OK );.
36c00 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
36c10 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
36c20 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
36c30 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
36c40 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
36c50 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20  Bt)<=10921 );.  
36c60 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
36c70 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50  Cell<=MX_CELL(pP
36c80 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52  age->pBt) || COR
36c90 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
36ca0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
36cb0 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65  rflow<=ArraySize
36cc0 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20  (pPage->apOvfl) 
36cd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72  );.  assert( Arr
36ce0 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70  aySize(pPage->ap
36cf0 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65  Ovfl)==ArraySize
36d00 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20  (pPage->aiOvfl) 
36d10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
36d20 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
36d30 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
36d40 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63  x) );.  /* The c
36d50 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  ell should norma
36d60 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72  lly be sized cor
36d70 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72  rectly.  However
36d80 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a  , when moving a.
36d90 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63    ** malformed c
36da0 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20  ell from a leaf 
36db0 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72  page to an inter
36dc0 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65  ior page, if the
36dd0 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20   cell size.  ** 
36de0 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73  wanted to be les
36df0 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74  s than 4 but got
36e00 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34   rounded up to 4
36e10 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68   on the leaf, th
36e20 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67  en size.  ** mig
36e30 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ht be less than 
36e40 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70  8 (leaf-size + p
36e50 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69  ointer) on the i
36e60 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48  nterior node.  H
36e70 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65  ence.  ** the te
36e80 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20  rm after the || 
36e90 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
36ea0 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20   assert(). */.  
36eb0 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67  assert( sz==pPag
36ec0 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
36ed0 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73  ge, pCell) || (s
36ee0 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30  z==8 && iChild>0
36ef0 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
36f00 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
36f10 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
36f20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
36f30 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
36f40 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20  y(pTemp, pCell, 
36f50 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  sz);.      pCell
36f60 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
36f70 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
36f80 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
36f90 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b  (pCell, iChild);
36fa0 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
36fb0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
36fc0 2b 3b 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72  +;.    /* Compar
36fd0 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 41 72 72  ison against Arr
36fe0 61 79 53 69 7a 65 2d 31 20 73 69 6e 63 65 20 77  aySize-1 since w
36ff0 65 20 68 6f 6c 64 20 62 61 63 6b 20 6f 6e 65 20  e hold back one 
37000 65 78 74 72 61 20 73 6c 6f 74 0a 20 20 20 20 2a  extra slot.    *
37010 2a 20 61 73 20 61 20 63 6f 6e 74 69 6e 67 65 6e  * as a contingen
37020 63 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  cy.  In other wo
37030 72 64 73 2c 20 6e 65 76 65 72 20 6e 65 65 64 20  rds, never need 
37040 6d 6f 72 65 20 74 68 61 6e 20 33 20 6f 76 65 72  more than 3 over
37050 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 73 6c 6f 74  flow.    ** slot
37060 73 20 62 75 74 20 34 20 61 72 65 20 61 6c 6c 6f  s but 4 are allo
37070 63 61 74 65 64 2c 20 6a 75 73 74 20 74 6f 20 62  cated, just to b
37080 65 20 73 61 66 65 2e 20 2a 2f 0a 20 20 20 20 61  e safe. */.    a
37090 73 73 65 72 74 28 20 6a 20 3c 20 41 72 72 61 79  ssert( j < Array
370a0 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76  Size(pPage->apOv
370b0 66 6c 29 2d 31 20 29 3b 0a 20 20 20 20 70 50 61  fl)-1 );.    pPa
370c0 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20  ge->apOvfl[j] = 
370d0 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
370e0 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75  ->aiOvfl[j] = (u
370f0 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  16)i;..    /* Wh
37100 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  en multiple over
37110 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68 65  flows occur, the
37120 79 20 61 72 65 20 61 6c 77 61 79 73 20 73 65 71  y are always seq
37130 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a 20  uential and in. 
37140 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64     ** sorted ord
37150 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72 69  er.  This invari
37160 61 6e 74 73 20 61 72 69 73 65 20 62 65 63 61 75  ants arise becau
37170 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  se multiple over
37180 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a 2a  flows can.    **
37190 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e   only occur when
371a0 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69 64   inserting divid
371b0 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68  er cells into th
371c0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 64 75  e parent page du
371d0 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c 61  ring.    ** bala
371e0 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20 64  ncing, and the d
371f0 69 76 69 64 65 72 73 20 61 72 65 20 61 64 6a 61  ividers are adja
37200 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64 2e  cent and sorted.
37210 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
37220 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61 67  rt( j==0 || pPag
37230 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28  e->aiOvfl[j-1]<(
37240 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65 72  u16)i ); /* Over
37250 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64 20  flows in sorted 
37260 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73 73  order */.    ass
37270 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d  ert( j==0 || i==
37280 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d  pPage->aiOvfl[j-
37290 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76 65  1]+1 );   /* Ove
372a0 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75 65  rflows are seque
372b0 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65  ntial */.  }else
372c0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
372d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
372e0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
372f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
37300 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37310 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
37320 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
37330 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
37340 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
37350 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
37360 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
37370 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
37380 20 20 20 20 61 73 73 65 72 74 28 20 26 64 61 74      assert( &dat
37390 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
373a0 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43 65  set]==pPage->aCe
373b0 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63 20  llIdx );.    rc 
373c0 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
373d0 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29  pPage, sz, &idx)
373e0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20  ;.    if( rc ){ 
373f0 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72  *pRC = rc; retur
37400 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20  n; }.    /* The 
37410 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20  allocateSpace() 
37420 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65  routine guarante
37430 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
37440 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20   properties.    
37450 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73  ** if it returns
37460 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a 2f   successfully */
37470 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
37480 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
37490 65 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61 67  ert( idx >= pPag
374a0 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  e->cellOffset+2*
374b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c  pPage->nCell+2 |
374c0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
374d0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b      assert( idx+
374e0 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  sz <= (int)pPage
374f0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
37500 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e );.    pPage->
37510 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32  nFree -= (u16)(2
37520 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63   + sz);.    memc
37530 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 70  py(&data[idx], p
37540 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69  Cell, sz);.    i
37550 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
37560 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
37570 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
37580 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73 20  .    }.    pIns 
37590 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64  = pPage->aCellId
375a0 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65 6d  x + i*2;.    mem
375b0 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49 6e  move(pIns+2, pIn
375c0 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  s, 2*(pPage->nCe
375d0 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70 75  ll - i));.    pu
375e0 74 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64 78  t2byte(pIns, idx
375f0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
37600 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e  ell++;.    /* in
37610 63 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c 6c  crement the cell
37620 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66   count */.    if
37630 28 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65 2d  ( (++data[pPage-
37640 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d 3d  >hdrOffset+4])==
37650 30 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d 3e  0 ) data[pPage->
37660 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a  hdrOffset+3]++;.
37670 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32      assert( get2
37680 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
37690 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d  ->hdrOffset+3])=
376a0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
376b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
376c0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
376d0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
376e0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
376f0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
37700 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
37710 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
37720 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
37730 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
37740 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
37750 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
37760 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
37770 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
37780 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70   */.      ptrmap
37790 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
377a0 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20  , pCell, pRC);. 
377b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
377c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41  }../*.** A CellA
377d0 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74  rray object cont
377e0 61 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66 20  ains a cache of 
377f0 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69 7a  pointers and siz
37800 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73  es for a.** cons
37810 65 63 75 74 69 76 65 20 73 65 71 75 65 6e 63 65  ecutive sequence
37820 20 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20 6d   of cells that m
37830 69 67 68 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  ight be held on 
37840 6d 75 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 0a  multiple pages..
37850 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
37860 74 20 43 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c  t CellArray Cell
37870 41 72 72 61 79 3b 0a 73 74 72 75 63 74 20 43 65  Array;.struct Ce
37880 6c 6c 41 72 72 61 79 20 7b 0a 20 20 69 6e 74 20  llArray {.  int 
37890 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
378a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
378b0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
378c0 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  [] */.  MemPage 
378d0 2a 70 52 65 66 3b 20 20 20 20 20 20 20 20 20 20  *pRef;          
378e0 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 70 61 67  /* Reference pag
378f0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
37900 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ll;            /
37910 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69  * All cells begi
37920 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  n balanced */.  
37930 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20  u16 *szCell;    
37940 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
37950 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
37960 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
37970 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  /.};../*.** Make
37980 20 73 75 72 65 20 74 68 65 20 63 65 6c 6c 20 73   sure the cell s
37990 69 7a 65 73 20 61 74 20 69 64 78 2c 20 69 64 78  izes at idx, idx
379a0 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31  +1, ..., idx+N-1
379b0 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f   have been.** co
379c0 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mputed..*/.stati
379d0 63 20 76 6f 69 64 20 70 6f 70 75 6c 61 74 65 43  c void populateC
379e0 65 6c 6c 43 61 63 68 65 28 43 65 6c 6c 41 72 72  ellCache(CellArr
379f0 61 79 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  ay *p, int idx, 
37a00 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74  int N){.  assert
37a10 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 2b  ( idx>=0 && idx+
37a20 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  N<=p->nCell );. 
37a30 20 77 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20   while( N>0 ){. 
37a40 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70     assert( p->ap
37a50 43 65 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a  Cell[idx]!=0 );.
37a60 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c      if( p->szCel
37a70 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20  l[idx]==0 ){.   
37a80 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78     p->szCell[idx
37a90 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65  ] = p->pRef->xCe
37aa0 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20  llSize(p->pRef, 
37ab0 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b  p->apCell[idx]);
37ac0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37ad0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
37ae0 54 5f 44 42 20 7c 7c 0a 20 20 20 20 20 20 20 20  T_DB ||.        
37af0 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b        p->szCell[
37b00 69 64 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78  idx]==p->pRef->x
37b10 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66  CellSize(p->pRef
37b20 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d  , p->apCell[idx]
37b30 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ) );.    }.    i
37b40 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20  dx++;.    N--;. 
37b50 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
37b60 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
37b70 68 65 20 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f  he Nth element o
37b80 66 20 74 68 65 20 63 65 6c 6c 20 61 72 72 61 79  f the cell array
37b90 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
37ba0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63  E_NOINLINE u16 c
37bb0 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 43  omputeCellSize(C
37bc0 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74  ellArray *p, int
37bd0 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e   N){.  assert( N
37be0 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c  >=0 && N<p->nCel
37bf0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
37c00 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29  ->szCell[N]==0 )
37c10 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  ;.  p->szCell[N]
37c20 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c   = p->pRef->xCel
37c30 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70  lSize(p->pRef, p
37c40 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20  ->apCell[N]);.  
37c50 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c  return p->szCell
37c60 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31  [N];.}.static u1
37c70 36 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65  6 cachedCellSize
37c80 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69  (CellArray *p, i
37c90 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt N){.  assert(
37ca0 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43   N>=0 && N<p->nC
37cb0 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ell );.  if( p->
37cc0 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75  szCell[N] ) retu
37cd0 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b  rn p->szCell[N];
37ce0 0a 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75 74  .  return comput
37cf0 65 43 65 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b  eCellSize(p, N);
37d00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20  .}../*.** Array 
37d10 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e  apCell[] contain
37d20 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43  s pointers to nC
37d30 65 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65 20  ell b-tree page 
37d40 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73  cells. The .** s
37d50 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f  zCell[] array co
37d60 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
37d70 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  in bytes of each
37d80 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   cell. This func
37d90 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73  tion.** replaces
37da0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
37db0 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70 50  tents of page pP
37dc0 67 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65  g with the conte
37dd0 6e 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a  nts of the cell.
37de0 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  ** array..**.** 
37df0 53 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  Some of the cell
37e00 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61  s in apCell[] ma
37e10 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73  y currently be s
37e20 74 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54 68  tored in pPg. Th
37e30 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  is.** function w
37e40 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f 62  orks around prob
37e50 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 74  lems caused by t
37e60 68 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61 20  his by making a 
37e70 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20  copy of any .** 
37e80 73 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f 72  such cells befor
37e90 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  e overwriting th
37ea0 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a  e page data..**.
37eb0 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e  ** The MemPage.n
37ec0 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e  Free field is in
37ed0 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69  validated by thi
37ee0 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69  s function. It i
37ef0 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
37f00 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
37f10 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74  caller to set it
37f20 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
37f30 74 61 74 69 63 20 69 6e 74 20 72 65 62 75 69 6c  tatic int rebuil
37f40 64 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  dPage(.  MemPage
37f50 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
37f60 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74           /* Edit
37f70 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
37f80 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
37f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37fa0 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20  /* Final number 
37fb0 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65  of cells on page
37fc0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
37fd0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
37fe0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
37ff0 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36  f cells */.  u16
38000 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20   *szCell        
38010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38020 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69  Array of cell si
38030 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  zes */.){.  cons
38040 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
38050 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
38060 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
38070 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67 20  f header on pPg 
38080 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
38090 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
380a0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ta;           /*
380b0 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   Pointer to data
380c0 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f   for pPg */.  co
380d0 6e 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53 69  nst int usableSi
380e0 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
380f0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20  sableSize;.  u8 
38100 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26  * const pEnd = &
38110 61 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  aData[usableSize
38120 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38  ];.  int i;.  u8
38130 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67   *pCellptr = pPg
38140 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38  ->aCellIdx;.  u8
38150 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33   *pTmp = sqlite3
38160 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
38170 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  Pg->pBt->pPager)
38180 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a  ;.  u8 *pData;..
38190 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26    i = get2byte(&
381a0 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  aData[hdr+5]);. 
381b0 20 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d   memcpy(&pTmp[i]
381c0 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73 61  , &aData[i], usa
381d0 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20  bleSize - i);.. 
381e0 20 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20   pData = pEnd;. 
381f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
38200 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
38210 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b  *pCell = apCell[
38220 69 5d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  i];.    if( SQLI
38230 54 45 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c  TE_WITHIN(pCell,
38240 61 44 61 74 61 2c 70 45 6e 64 29 20 29 7b 0a 20  aData,pEnd) ){. 
38250 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54       pCell = &pT
38260 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61  mp[pCell - aData
38270 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 61  ];.    }.    pDa
38280 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b  ta -= szCell[i];
38290 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43  .    put2byte(pC
382a0 65 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20 2d  ellptr, (pData -
382b0 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43   aData));.    pC
382c0 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20  ellptr += 2;.   
382d0 20 69 66 28 20 70 44 61 74 61 20 3c 20 70 43 65   if( pData < pCe
382e0 6c 6c 70 74 72 20 29 20 72 65 74 75 72 6e 20 53  llptr ) return S
382f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
38300 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  PT;.    memcpy(p
38310 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43  Data, pCell, szC
38320 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73  ell[i]);.    ass
38330 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d  ert( szCell[i]==
38340 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  pPg->xCellSize(p
38350 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f  Pg, pCell) || CO
38360 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
38370 74 65 73 74 63 61 73 65 28 20 73 7a 43 65 6c 6c  testcase( szCell
38380 5b 69 5d 21 3d 70 50 67 2d 3e 78 43 65 6c 6c 53  [i]!=pPg->xCellS
38390 69 7a 65 28 70 50 67 2c 70 43 65 6c 6c 29 20 29  ize(pPg,pCell) )
383a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
383b0 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64  pPg->nFree field
383c0 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f   is now set inco
383d0 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c  rrectly. The cal
383e0 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e  ler will fix it.
383f0 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c   */.  pPg->nCell
38400 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d   = nCell;.  pPg-
38410 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
38420 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
38430 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20  ta[hdr+1], 0);. 
38440 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
38450 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43  [hdr+3], pPg->nC
38460 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ell);.  put2byte
38470 28 26