/ Hex Artifact Content
Login

Artifact ac5e98b809c0e7e2d1840afa0908f6aa2542cf7bed631aab17199047a35b5588:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20  EBUG */..#ifdef 
2390: 53 51 4c 49 54 45 5f 53 45 52 56 45 52 5f 45 44  SQLITE_SERVER_ED
23a0: 49 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ITION./*.** Retu
23b0: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 62  rn true if the b
23c0: 2d 74 72 65 65 20 75 73 65 73 20 66 72 65 65 2d  -tree uses free-
23d0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 32 2e 20 4f  list format 2. O
23e0: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
23f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2400: 20 62 74 72 65 65 46 72 65 65 6c 69 73 74 46 6f   btreeFreelistFo
2410: 72 6d 61 74 32 28 42 74 53 68 61 72 65 64 20 2a  rmat2(BtShared *
2420: 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  pBt){.  return (
2430: 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
2440: 74 61 5b 31 38 5d 20 3e 20 32 29 3b 0a 7d 0a 23  ta[18] > 2);.}.#
2450: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 51 75 65  endif../*.** Que
2460: 72 79 20 74 6f 20 73 65 65 20 69 66 20 42 74 72  ry to see if Btr
2470: 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61 79 20  ee handle p may 
2480: 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66  obtain a lock of
2490: 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20   type eLock .** 
24a0: 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52  (READ_LOCK or WR
24b0: 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74 68 65  ITE_LOCK) on the
24c0: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
24d0: 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65 74 75  -page iTab. Retu
24e0: 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  rn.** SQLITE_OK 
24f0: 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61 79 20  if the lock may 
2500: 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62 79 20  be obtained (by 
2510: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74 53 68  calling.** setSh
2520: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
2530: 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49 54 45  ck()), or SQLITE
2540: 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a  _LOCKED if not..
2550: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75  */.static int qu
2560: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
2570: 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70  bleLock(Btree *p
2580: 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38 20  , Pgno iTab, u8 
2590: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
25a0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
25b0: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65  ;.  BtLock *pIte
25c0: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  r;..  assert( sq
25d0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
25e0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
25f0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
2600: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
2610: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  WRITE_LOCK );.  
2620: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30  assert( p->db!=0
2630: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 28   );.  assert( !(
2640: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  p->db->flags&SQL
2650: 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
2660: 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  )||eLock==WRITE_
2670: 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b  LOCK||iTab==1 );
2680: 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75  .  .  /* If requ
2690: 65 73 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  esting a write-l
26a0: 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74  ock, then the Bt
26b0: 72 65 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e  ree must have an
26c0: 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a   open write.  **
26d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
26e0: 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20  this file. And, 
26f0: 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74  obviously, for t
2700: 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65  his to be so the
2710: 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65  re .  ** must be
2720: 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
2730: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2740: 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20  e file itself.. 
2750: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c   */.  assert( eL
2760: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2770: 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74  | (p==pBt->pWrit
2780: 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  er && p->inTrans
2790: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29  ==TRANS_WRITE) )
27a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
27b0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
27c0: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
27d0: 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
27e0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20  );.  .  /* This 
27f0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
2800: 6f 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64  op if the shared
2810: 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e  -cache is not en
2820: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21  abled */.  if( !
2830: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
2840: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2850: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  _OK;.  }..  /* I
2860: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e  f some other con
2870: 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
2880: 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ng an exclusive 
2890: 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72  lock, the.  ** r
28a0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61  equested lock ma
28b0: 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  y not be obtaine
28c0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  d..  */.  if( pB
28d0: 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26  t->pWriter!=p &&
28e0: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
28f0: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
2900: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
2910: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
2920: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e  ked(p->db, pBt->
2930: 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20  pWriter->db);.  
2940: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2950: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
2960: 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70  HE;.  }..  for(p
2970: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2980: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2990: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
29a0: 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f   /* The conditio
29b0: 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21  n (pIter->eLock!
29c0: 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66  =eLock) in the f
29d0: 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29  ollowing if(...)
29e0: 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65   .    ** stateme
29f0: 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69  nt is a simplifi
2a00: 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a  cation of:.    *
2a10: 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63  *.    **   (eLoc
2a20: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c  k==WRITE_LOCK ||
2a30: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57   pIter->eLock==W
2a40: 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a  RITE_LOCK).    *
2a50: 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77  *.    ** since w
2a60: 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65  e know that if e
2a70: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2a80: 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20  , then no other 
2a90: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a  connection.    *
2aa0: 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49  * may hold a WRI
2ab0: 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74  TE_LOCK on any t
2ac0: 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c  able in this fil
2ad0: 65 20 28 73 69 6e 63 65 20 74 68 65 72 65 20 63  e (since there c
2ae0: 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62  an.    ** only b
2af0: 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65  e a single write
2b00: 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  r)..    */.    a
2b10: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c  ssert( pIter->eL
2b20: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2b30: 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  | pIter->eLock==
2b40: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  WRITE_LOCK );.  
2b50: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2b60: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  =READ_LOCK || pI
2b70: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c  ter->pBtree==p |
2b80: 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  | pIter->eLock==
2b90: 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  READ_LOCK);.    
2ba0: 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
2bb0: 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69  e!=p && pIter->i
2bc0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70  Table==iTab && p
2bd0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f  Iter->eLock!=eLo
2be0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ck ){.      sqli
2bf0: 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
2c00: 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65  cked(p->db, pIte
2c10: 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a  r->pBtree->db);.
2c20: 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d        if( eLock=
2c30: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20  =WRITE_LOCK ){. 
2c40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2c50: 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  ==pBt->pWriter )
2c60: 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62  ;.        pBt->b
2c70: 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
2c80: 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a  ENDING;.      }.
2c90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2ca0: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
2cb0: 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20  DCACHE;.    }.  
2cc0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2cd0: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
2ce0: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  * !SQLITE_OMIT_S
2cf0: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
2d00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d10: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
2d20: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63  ./*.** Add a loc
2d30: 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77  k on the table w
2d40: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54  ith root-page iT
2d50: 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72  able to the shar
2d60: 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a  ed-btree used.**
2d70: 20 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65   by Btree handle
2d80: 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c   p. Parameter eL
2d90: 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68  ock must be eith
2da0: 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  er READ_LOCK or 
2db0: 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a  .** WRITE_LOCK..
2dc0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2dd0: 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20  ion assumes the 
2de0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
2df0: 20 20 20 28 61 29 20 54 68 65 20 73 70 65 63 69     (a) The speci
2e00: 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63  fied Btree objec
2e10: 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64  t p is connected
2e20: 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a   to a sharable.*
2e30: 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  *       database
2e40: 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42   (one with the B
2e50: 74 53 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65  tShared.sharable
2e60: 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a   flag set), and.
2e70: 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f  **.**   (b) No o
2e80: 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63  ther Btree objec
2e90: 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74  ts hold a lock t
2ea0: 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a  hat conflicts.**
2eb0: 20 20 20 20 20 20 20 77 69 74 68 20 74 68 65 20         with the 
2ec0: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28  requested lock (
2ed0: 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72 65 64  i.e. queryShared
2ee0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
2ef0: 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c   has.**       al
2f00: 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
2f10: 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53  d and returned S
2f20: 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a  QLITE_OK)..**.**
2f30: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2f40: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f  turned if the lo
2f50: 63 6b 20 69 73 20 61 64 64 65 64 20 73 75 63 63  ck is added succ
2f60: 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45  essfully. SQLITE
2f70: 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65  _NOMEM .** is re
2f80: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
2f90: 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73  oc attempt fails
2fa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2fb0: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
2fc0: 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70  bleLock(Btree *p
2fd0: 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75  , Pgno iTable, u
2fe0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
2ff0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3000: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  Bt;.  BtLock *pL
3010: 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63  ock = 0;.  BtLoc
3020: 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73  k *pIter;..  ass
3030: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
3040: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3050: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
3060: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
3070: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
3080: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
3090: 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  ->db!=0 );..  /*
30a0: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69   A connection wi
30b0: 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f  th the read-unco
30c0: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74  mmitted flag set
30d0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20   will never try 
30e0: 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61  to.  ** obtain a
30f0: 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67   read-lock using
3100: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
3110: 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f  The only read-lo
3120: 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a  ck obtained.  **
3130: 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e   by a connection
3140: 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69   in read-uncommi
3150: 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20  tted mode is on 
3160: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
3170: 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61  r .  ** table, a
3180: 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20  nd that lock is 
3190: 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65  obtained in Btre
31a0: 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20  eBeginTrans().  
31b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  */.  assert( 0==
31c0: 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51  (p->db->flags&SQ
31d0: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
31e0: 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  t) || eLock==WRI
31f0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  TE_LOCK );..  /*
3200: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
3210: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
3220: 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62  lled on a sharab
3230: 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72 20  le b-tree after 
3240: 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65  it .  ** has bee
3250: 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  n determined tha
3260: 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65  t no other b-tre
3270: 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69  e holds a confli
3280: 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a  cting lock.  */.
3290: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61    assert( p->sha
32a0: 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  rable );.  asser
32b0: 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75  t( SQLITE_OK==qu
32c0: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
32d0: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
32e0: 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20  e, eLock) );..  
32f0: 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68 20  /* First search 
3300: 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20  the list for an 
3310: 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e  existing lock on
3320: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a   this table. */.
3330: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
3340: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
3350: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
3360: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65  t){.    if( pIte
3370: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
3380: 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72  e && pIter->pBtr
3390: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70  ee==p ){.      p
33a0: 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20  Lock = pIter;.  
33b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
33c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
33d0: 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20 64  e above search d
33e0: 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74  id not find a Bt
33f0: 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f  Lock struct asso
3400: 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a  ciating Btree p.
3410: 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20    ** with table 
3420: 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65  iTable, allocate
3430: 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74   one and link it
3440: 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a   into the list..
3450: 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63    */.  if( !pLoc
3460: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d  k ){.    pLock =
3470: 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74   (BtLock *)sqlit
3480: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
3490: 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20  eof(BtLock));.  
34a0: 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a    if( !pLock ){.
34b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
34c0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
34d0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d      }.    pLock-
34e0: 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65  >iTable = iTable
34f0: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74  ;.    pLock->pBt
3500: 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f  ree = p;.    pLo
3510: 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ck->pNext = pBt-
3520: 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  >pLock;.    pBt-
3530: 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a  >pLock = pLock;.
3540: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
3550: 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76  e BtLock.eLock v
3560: 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6d  ariable to the m
3570: 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63 75  aximum of the cu
3580: 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20  rrent lock.  ** 
3590: 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
35a0: 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61  d lock. This mea
35b0: 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c 6f  ns if a write-lo
35c0: 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20 68  ck was already h
35d0: 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  eld.  ** and a r
35e0: 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74  ead-lock request
35f0: 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e 63  ed, we don't inc
3600: 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72 61  orrectly downgra
3610: 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a  de the lock..  *
3620: 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49 54  /.  assert( WRIT
3630: 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b  E_LOCK>READ_LOCK
3640: 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e   );.  if( eLock>
3650: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a  pLock->eLock ){.
3660: 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b      pLock->eLock
3670: 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = eLock;.  }.. 
3680: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3690: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
36a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
36b0: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
36c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
36d0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
36e0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20  .** Release all 
36f0: 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20  the table locks 
3700: 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20  (locks obtained 
3710: 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  via calls to.** 
3720: 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61 63  the setSharedCac
3730: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72  heTableLock() pr
3740: 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62 79  ocedure) held by
3750: 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70 2e   Btree object p.
3760: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
3770: 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
3780: 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61 6e  t Btree p has an
3790: 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77 72   open read or wr
37a0: 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ite .** transact
37b0: 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73 20  ion. If it does 
37c0: 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42 54  not, then the BT
37d0: 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 0a 2a  S_PENDING flag.*
37e0: 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72 72 65  * may be incorre
37f0: 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f  ctly cleared..*/
3800: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65  .static void cle
3810: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
3820: 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65  TableLocks(Btree
3830: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
3840: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
3850: 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65    BtLock **ppIte
3860: 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b  r = &pBt->pLock;
3870: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
3880: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
3890: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
38a0: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  t( p->sharable |
38b0: 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a  | 0==*ppIter );.
38c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
38d0: 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69  rans>0 );..  whi
38e0: 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a 20  le( *ppIter ){. 
38f0: 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b     BtLock *pLock
3900: 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20 20   = *ppIter;.    
3910: 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74  assert( (pBt->bt
3920: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
3930: 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20 70 42  LUSIVE)==0 || pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63  t->pWriter==pLoc
3950: 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20 20 20  k->pBtree );.   
3960: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
3970: 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e  pBtree->inTrans>
3980: 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b  =pLock->eLock );
3990: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
39a0: 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
39b0: 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f     *ppIter = pLo
39c0: 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ck->pNext;.     
39d0: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
39e0: 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f  iTable!=1 || pLo
39f0: 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a  ck==&p->lock );.
3a00: 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d        if( pLock-
3a10: 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20  >iTable!=1 ){.  
3a20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
3a30: 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  ee(pLock);.     
3a40: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
3a50: 20 20 20 20 70 70 49 74 65 72 20 3d 20 26 70 4c      ppIter = &pL
3a60: 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ock->pNext;.    
3a70: 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
3a80: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3a90: 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 3d 3d  & BTS_PENDING)==
3aa0: 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65  0 || pBt->pWrite
3ab0: 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  r );.  if( pBt->
3ac0: 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20  pWriter==p ){.  
3ad0: 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d    pBt->pWriter =
3ae0: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   0;.    pBt->bts
3af0: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45  Flags &= ~(BTS_E
3b00: 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e  XCLUSIVE|BTS_PEN
3b10: 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65 20 69  DING);.  }else i
3b20: 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  f( pBt->nTransac
3b30: 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f  tion==2 ){.    /
3b40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3b50: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 42  is called when B
3b60: 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63 6c 75  tree p is conclu
3b70: 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20 2a 2a  ding its .    **
3b80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3b90: 20 74 68 65 72 65 20 63 75 72 72 65 6e 74 6c 79   there currently
3ba0: 20 65 78 69 73 74 73 20 61 20 77 72 69 74 65 72   exists a writer
3bb0: 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20  , and p is not. 
3bc0: 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69 74 65     ** that write
3bd0: 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  r, then the numb
3be0: 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  er of locks held
3bf0: 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
3c00: 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  other.    ** tha
3c10: 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d 75 73  n the writer mus
3c20: 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20 64 72  t be about to dr
3c30: 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74  op to zero. In t
3c40: 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a 2a 20  his case.    ** 
3c50: 73 65 74 20 74 68 65 20 42 54 53 5f 50 45 4e 44  set the BTS_PEND
3c60: 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20  ING flag to 0.. 
3c70: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
3c80: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63 75 72  there is not cur
3c90: 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65 72 2c  rently a writer,
3ca0: 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44 49 4e   then BTS_PENDIN
3cb0: 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  G must.    ** be
3cc0: 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e 20 53   zero already. S
3cd0: 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69 6e 65  o this next line
3ce0: 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69 6e 20   is harmless in 
3cf0: 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a  that case..    *
3d00: 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  /.    pBt->btsFl
3d10: 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45 4e 44  ags &= ~BTS_PEND
3d20: 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ING;.  }.}../*.*
3d30: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3d40: 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72 69 74  changes all writ
3d50: 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  e-locks held by 
3d60: 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72 65 61  Btree p into rea
3d70: 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74  d-locks..*/.stat
3d80: 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61 64  ic void downgrad
3d90: 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
3da0: 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20  ableLocks(Btree 
3db0: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
3dc0: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
3dd0: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
3de0: 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f  r==p ){.    BtLo
3df0: 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70  ck *pLock;.    p
3e00: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3e10: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
3e20: 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c  gs &= ~(BTS_EXCL
3e30: 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e  USIVE|BTS_PENDIN
3e40: 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63  G);.    for(pLoc
3e50: 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c  k=pBt->pLock; pL
3e60: 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b  ock; pLock=pLock
3e70: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
3e80: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65  assert( pLock->e
3e90: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
3ea0: 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  || pLock->pBtree
3eb0: 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f  ==p );.      pLo
3ec0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44  ck->eLock = READ
3ed0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _LOCK;.    }.  }
3ee0: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
3ef0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3f00: 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69  _CACHE */..stati
3f10: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
3f20: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
3f30: 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  e);         /* F
3f40: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
3f50: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
3f60: 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 4d  releasePageOne(M
3f70: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
3f80: 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72 64 20       /* Forward 
3f90: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
3fa0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3fb0: 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50  PageNotNull(MemP
3fc0: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3fd0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3fe0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ff0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4000: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
4010: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
4020: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
4030: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
4040: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
4050: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
4060: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4070: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
4080: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
4090: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
40a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
40b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
40c0: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f  Bt->mutex);.}../
40d0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
40e0: 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74 68 65  e cursor and the
40f0: 20 42 74 53 68 61 72 65 64 20 61 67 72 65 65 20   BtShared agree 
4100: 61 62 6f 75 74 20 77 68 61 74 20 69 73 20 74 68  about what is th
4110: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74  e current.** dat
4120: 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e  abase connetion.
4130: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
4140: 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63 61 63  nt in shared-cac
4150: 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  he mode. If the 
4160: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e  database .** con
4170: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  nection pointers
4180: 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63   get out-of-sync
4190: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
41a0: 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20 6c 69   for routines li
41b0: 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  ke.** btreeInitP
41c0: 61 67 65 28 29 20 74 6f 20 72 65 66 65 72 65 6e  age() to referen
41d0: 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e  ce an stale conn
41e0: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74  ection pointer t
41f0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  hat references a
4200: 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  .** a connection
4210: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
4220: 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69 73 20  y closed.  This 
4230: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
4240: 69 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 0a  inside assert().
4250: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  ** statements on
4260: 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  ly and for the p
4270: 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65  urpose of double
4280: 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74  -checking that t
4290: 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a  he btree code.**
42a0: 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65 20 64   does keep the d
42b0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
42c0: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70 2d 74  on pointers up-t
42d0: 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  o-date..*/.stati
42e0: 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73  c int cursorOwns
42f0: 42 74 53 68 61 72 65 64 28 42 74 43 75 72 73 6f  BtShared(BtCurso
4300: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
4310: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
4320: 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  x(p) );.  return
4330: 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d   (p->pBtree->db=
4340: 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a  =p->pBt->db);.}.
4350: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
4360: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
4370: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
4380: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
4390: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
43a0: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
43b0: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
43c0: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
43d0: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
43e0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
43f0: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
4400: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
4410: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
4420: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
4430: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
4440: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
4450: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
4460: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
4470: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
4480: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
4490: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
44a0: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
44b0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
44c0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
44d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
44e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
44f0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
4500: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
4510: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
4520: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
4530: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
4540: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
4550: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4560: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
4570: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4580: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
4590: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
45a0: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
45b0: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
45c0: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
45d0: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
45e0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
45f0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
4600: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
4610: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
4620: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4630: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
4640: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
4650: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
4660: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
4670: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
4680: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4690: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
46a0: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
46b0: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
46c0: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
46d0: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
46e0: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
46f0: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
4700: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
4710: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
4720: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
4730: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
4740: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
4750: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
4760: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
4770: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
4780: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
4790: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
47a0: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
47b0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
47c0: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
47d0: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
47e0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
47f0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
4800: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
4810: 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20  Pgno pgnoRoot,  
4820: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
4830: 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68 74 20  able that might 
4840: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
4850: 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20   i64 iRow,      
4860: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4870: 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74  rowid that might
4880: 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a   be changing */.
4890: 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62    int isClearTab
48a0: 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le        /* Tru
48b0: 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  e if all rows ar
48c0: 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  e being deleted 
48d0: 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
48e0: 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65   *p;.  if( pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
4910: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4920: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
4930: 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74  pBtree) );.  pBt
4940: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4950: 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  Cur = 0;.  for(p
4960: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
4970: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
4980: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28  Next){.    if( (
4990: 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  p->curFlags & BT
49a0: 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20  CF_Incrblob)!=0 
49b0: 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d  ){.      pBtree-
49c0: 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20  >hasIncrblobCur 
49d0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 1;.      if( p
49e0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67 6e 6f  ->pgnoRoot==pgno
49f0: 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65 61 72  Root && (isClear
4a00: 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f  Table || p->info
4a10: 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b 0a  .nKey==iRow) ){.
4a20: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
4a30: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
4a40: 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ID;.      }.    
4a50: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20  }.  }.}..#else. 
4a60: 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f   /* Stub functio
4a70: 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20  n when INCRBLOB 
4a80: 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  is omitted */.  
4a90: 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61  #define invalida
4aa0: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
4ab0: 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  s(w,x,y,z).#endi
4ac0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
4ad0: 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a  _INCRBLOB */../*
4ae0: 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f  .** Set bit pgno
4af0: 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64   of the BtShared
4b00: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4b10: 76 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c  vec. This is cal
4b20: 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70  led .** when a p
4b30: 61 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75  age that previou
4b40: 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61  sly contained da
4b50: 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65  ta becomes a fre
4b60: 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20  e-list leaf .** 
4b70: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
4b80: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4b90: 74 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73  tent bitvec exis
4ba0: 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ts to work aroun
4bb0: 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20  d an obscure.** 
4bc0: 62 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68  bug caused by th
4bd0: 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66  e interaction of
4be0: 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f   two useful IO o
4bf0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72  ptimizations sur
4c00: 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65  rounding.** free
4c10: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65  :.**.**   1) Whe
4c30: 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65  n all data is de
4c40: 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67  leted from a pag
4c50: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62  e and the page b
4c60: 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61  ecomes.**      a
4c70: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4c80: 70 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69  page, the page i
4c90: 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
4ca0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
4cb0: 20 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c        (as free-l
4cc0: 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63  ist leaf pages c
4cd0: 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e  ontain no meanin
4ce0: 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65  gful data). Some
4cf0: 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75  times.**      su
4d00: 63 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74  ch a page is not
4d10: 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64   even journalled
4d20: 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74   (as it will not
4d30: 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a   be modified,.**
4d40: 20 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72        why bother
4d50: 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f   journalling it?
4d60: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68  )..**.**   2) Wh
4d70: 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  en a free-list l
4d80: 65 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73  eaf page is reus
4d90: 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  ed, its content 
4da0: 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20  is not read.**  
4db0: 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74      from the dat
4dc0: 61 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e  abase or written
4dd0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
4de0: 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64  file (why should
4df0: 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20   it.**      be, 
4e00: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20  if it is not at 
4e10: 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29  all meaningful?)
4e20: 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73  ..**.** By thems
4e30: 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74  elves, these opt
4e40: 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20  imizations work 
4e50: 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65  fine and provide
4e60: 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66   a handy.** perf
4e70: 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f  ormance boost to
4e80: 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20   bulk delete or 
4e90: 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e  insert operation
4ea0: 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a  s. However, if.*
4eb0: 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  * a page is move
4ec0: 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69  d to the free-li
4ed0: 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73  st and then reus
4ee0: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ed within the sa
4ef0: 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  me.** transactio
4f00: 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d  n, a problem com
4f10: 65 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61  es up. If the pa
4f20: 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61  ge is not journa
4f30: 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20  lled when.** it 
4f40: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
4f50: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74  free-list and it
4f60: 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75   is also not jou
4f70: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a  rnalled when it.
4f80: 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ** is extracted 
4f90: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
4fa0: 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74  st and reused, t
4fb0: 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hen the original
4fc0: 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20   data.** may be 
4fd0: 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65  lost. In the eve
4fe0: 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  nt of a rollback
4ff0: 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20  , it may not be 
5000: 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72  possible.** to r
5010: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
5020: 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
5030: 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  nal configuratio
5040: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c  n..**.** The sol
5050: 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53  ution is the BtS
5060: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
5070: 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  t bitvec. Whenev
5080: 65 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a  er a page is .**
5090: 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65   moved to become
50a0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
50b0: 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72  f page, the corr
50c0: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
50d0: 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62  .** set in the b
50e0: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
50f0: 61 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65  a leaf page is e
5100: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
5110: 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20  e free-list,.** 
5120: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61  optimization 2 a
5130: 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20  bove is omitted 
5140: 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  if the correspon
5150: 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65  ding bit is alre
5160: 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74  ady.** set in Bt
5170: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
5180: 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73  nt. The contents
5190: 20 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61   of the bitvec a
51a0: 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74  re cleared.** at
51b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
51c0: 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  y transaction..*
51d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
51e0: 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeSetHasContent(
51f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
5200: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
5210: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5220: 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61  .  if( !pBt->pHa
5230: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
5240: 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42  assert( pgno<=pB
5250: 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  t->nPage );.    
5260: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
5270: 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
5280: 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67  Create(pBt->nPag
5290: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74  e);.    if( !pBt
52a0: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b  ->pHasContent ){
52b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
52c0: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
52d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
52e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
52f0: 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74  pgno<=sqlite3Bit
5300: 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61  vecSize(pBt->pHa
5310: 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20  sContent) ){.   
5320: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
5330: 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73  vecSet(pBt->pHas
5340: 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a  Content, pgno);.
5350: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20  .}../*.** Query 
5370: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
5380: 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e  sContent vector.
5390: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
53a0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
53b0: 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20  hen a free-list 
53c0: 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65 6d  leaf page is rem
53d0: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  oved from the.**
53e0: 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72   free-list for r
53f0: 65 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73  euse. It returns
5400: 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
5410: 73 61 66 65 20 74 6f 20 72 65 74 72 69 65 76 65  safe to retrieve
5420: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f   the.** page fro
5430: 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  m the pager laye
5440: 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63  r with the 'no-c
5450: 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74  ontent' flag set
5460: 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69 73 65  . True otherwise
5470: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5480: 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65  btreeGetHasConte
5490: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
54a0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
54b0: 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d  Bitvec *p = pBt-
54c0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20  >pHasContent;.  
54d0: 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 67  return (p && (pg
54e0: 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63  no>sqlite3Bitvec
54f0: 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74  Size(p) || sqlit
5500: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2c 20  e3BitvecTest(p, 
5510: 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pgno)));.}../*.*
5520: 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79  * Clear (destroy
5530: 29 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  ) the BtShared.p
5540: 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65  HasContent bitve
5550: 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  c. This should b
5560: 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20  e.** invoked at 
5570: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
5580: 66 20 65 61 63 68 20 77 72 69 74 65 2d 74 72 61  f each write-tra
5590: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
55a0: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c  tic void btreeCl
55b0: 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  earHasContent(Bt
55c0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
55d0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
55e0: 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f  troy(pBt->pHasCo
55f0: 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70  ntent);.  pBt->p
5600: 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a  HasContent = 0;.
5610: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
5620: 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61   all of the apPa
5630: 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61  ge[] pages for a
5640: 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   cursor..*/.stat
5650: 69 63 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c  ic void btreeRel
5660: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5670: 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  es(BtCursor *pCu
5680: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  r){.  int i;.  i
5690: 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
56a0: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
56b0: 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b  ; i<pCur->iPage;
56c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
56d0: 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
56e0: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
56f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
5700: 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
5710: 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20  Cur->pPage);.   
5720: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
5730: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
5740: 54 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65  The cursor passe
5750: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
5760: 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e  gument must poin
5770: 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  t to a valid ent
5780: 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ry.** when this 
5790: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
57a0: 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53  ed (i.e. have eS
57b0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
57c0: 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ID). This.** fun
57d0: 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20  ction saves the 
57e0: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b  current cursor k
57f0: 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20  ey in variables 
5800: 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a  pCur->nKey and.*
5810: 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51  * pCur->pKey. SQ
5820: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
5830: 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ned if successfu
5840: 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  l or an SQLite e
5850: 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74  rror .** code ot
5860: 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  herwise..**.** I
5870: 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
5880: 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65  open on an intke
5890: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  y table, then th
58a0: 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a  e integer key.**
58b0: 20 28 74 68 65 20 72 6f 77 69 64 29 20 69 73 20   (the rowid) is 
58c0: 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e  stored in pCur->
58d0: 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70  nKey and pCur->p
58e0: 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65 74 20  Key is left set 
58f0: 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74  to.** NULL. If t
5900: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  he cursor is ope
5910: 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  n on a non-intke
5920: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43  y table, then pC
5930: 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20  ur->pKey is .** 
5940: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
5950: 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65  a malloced buffe
5960: 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74  r pCur->nKey byt
5970: 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61  es in size conta
5980: 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65  ining .** the ke
5990: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
59a0: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42   saveCursorKey(B
59b0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
59c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
59d0: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
59e0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
59f0: 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20  ur->eState );.  
5a00: 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d  assert( 0==pCur-
5a10: 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  >pKey );.  asser
5a20: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
5a30: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
5a40: 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  if( pCur->curInt
5a50: 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e  Key ){.    /* On
5a60: 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69 73 20  ly the rowid is 
5a70: 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 20 74  required for a t
5a80: 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a 20 20  able btree */.  
5a90: 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73    pCur->nKey = s
5aa0: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65 67  qlite3BtreeInteg
5ab0: 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 7d  erKey(pCur);.  }
5ac0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 6f 72  else{.    /* For
5ad0: 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 2c   an index btree,
5ae0: 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70 6c 65   save the comple
5af0: 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 2a  te key content *
5b00: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
5b10: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
5b20: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
5b30: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
5b40: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
5b50: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
5b60: 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66  ->nKey );.    if
5b70: 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ( pKey ){.      
5b80: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
5b90: 65 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  ePayload(pCur, 0
5ba0: 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  , (int)pCur->nKe
5bb0: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
5bc0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5bd0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
5be0: 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a  r->pKey = pKey;.
5bf0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5c00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
5c10: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
5c20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5c30: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
5c40: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
5c50: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
5c60: 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c  Cur->curIntKey |
5c70: 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  | !pCur->pKey );
5c80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5c90: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
5ca0: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
5cb0: 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76  osition in the v
5cc0: 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f  ariables BtCurso
5cd0: 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42  r.nKey .** and B
5ce0: 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68  tCursor.pKey. Th
5cf0: 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74 65  e cursor's state
5d00: 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
5d10: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a  R_REQUIRESEEK..*
5d20: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
5d30: 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
5d40: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76   the cursor is v
5d50: 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74 65  alid (has eState
5d60: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a  ==CURSOR_VALID).
5d70: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
5d80: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
5d90: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
5da0: 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  t saveCursorPosi
5db0: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
5dc0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
5dd0: 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
5de0: 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
5df0: 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f  State || CURSOR_
5e00: 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e  SKIPNEXT==pCur->
5e10: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5e20: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5e30: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
5e40: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5e50: 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  pCur) );..  if( 
5e60: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
5e70: 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b  RSOR_SKIPNEXT ){
5e80: 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
5e90: 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
5ea0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
5eb0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
5ec0: 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  0;.  }..  rc = s
5ed0: 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70 43 75  aveCursorKey(pCu
5ee0: 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
5ef0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62  LITE_OK ){.    b
5f00: 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75  treeReleaseAllCu
5f10: 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b  rsorPages(pCur);
5f20: 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
5f30: 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49  e = CURSOR_REQUI
5f40: 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70  RESEEK;.  }..  p
5f50: 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
5f60: 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
5f70: 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
5f80: 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b 0a 20  |BTCF_AtLast);. 
5f90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5fa0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
5fb0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
5fc0: 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
5fd0: 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  E saveCursorsOnL
5fe0: 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67  ist(BtCursor*,Pg
5ff0: 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a  no,BtCursor*);..
6000: 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70  /*.** Save the p
6010: 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20  ositions of all 
6020: 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74 20  cursors (except 
6030: 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61 72  pExcept) that ar
6040: 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65  e open on.** the
6050: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
6060: 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53  -page iRoot.  "S
6070: 61 76 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  aving the cursor
6080: 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73   position" means
6090: 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63   that.** the loc
60a0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72  ation in the btr
60b0: 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64  ee is remembered
60c0: 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
60d0: 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a  hat it can be.**
60e0: 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74   moved back to t
60f0: 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74  he same spot aft
6100: 65 72 20 74 68 65 20 62 74 72 65 65 20 68 61 73  er the btree has
6110: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
6120: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
6130: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20   is called just 
6140: 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45  before cursor pE
6150: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
6160: 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74   modify the.** t
6170: 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c  able, for exampl
6180: 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65  e in BtreeDelete
6190: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
61a0: 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  t()..**.** If th
61b0: 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d  ere are two or m
61c0: 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ore cursors on t
61d0: 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74  he same btree, t
61e0: 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a 2a 2a  hen all such .**
61f0: 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c 64 20   cursors should 
6200: 68 61 76 65 20 74 68 65 69 72 20 42 54 43 46 5f  have their BTCF_
6210: 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65  Multiple flag se
6220: 74 2e 20 20 54 68 65 20 62 74 72 65 65 43 75 72  t.  The btreeCur
6230: 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  sor().** routine
6240: 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74 20 72   enforces that r
6250: 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ule.  This routi
6260: 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f  ne only needs to
6270: 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a   be called in.**
6280: 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61   the uncommon ca
6290: 73 65 20 77 68 65 6e 20 70 45 78 70 65 63 74 20  se when pExpect 
62a0: 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  has the BTCF_Mul
62b0: 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 0a  tiple flag set..
62c0: 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65 63 74  **.** If pExpect
62d0: 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20 6e 6f  !=NULL and if no
62e0: 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 61   other cursors a
62f0: 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20  re found on the 
6300: 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65 2c 0a  same root-page,.
6310: 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54 43 46  ** then the BTCF
6320: 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 6f  _Multiple flag o
6330: 6e 20 70 45 78 70 65 63 74 20 69 73 20 63 6c 65  n pExpect is cle
6340: 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64 20 61  ared, to avoid a
6350: 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c  nother.** pointl
6360: 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ess call to this
6370: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
6380: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e  Implementation n
6390: 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75 74 69  ote:  This routi
63a0: 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63 6b 73  ne merely checks
63b0: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79 20 63   to see if any c
63c0: 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74  ursors.** need t
63d0: 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49 74 20  o be saved.  It 
63e0: 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61 76  calls out to sav
63f0: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29  eCursorsOnList()
6400: 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75 61 6c   in the (unusual
6410: 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61 74 20  ).** event that 
6420: 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 20 6e  cursors are in n
6430: 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73 61 76  eed to being sav
6440: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
6450: 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  t saveAllCursors
6460: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6470: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75  Pgno iRoot, BtCu
6480: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a  rsor *pExcept){.
6490: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
64a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
64b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
64c0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
64d0: 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20  ert( pExcept==0 
64e0: 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d  || pExcept->pBt=
64f0: 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d  =pBt );.  for(p=
6500: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
6510: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
6520: 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74    if( p!=pExcept
6530: 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c   && (0==iRoot ||
6540: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
6550: 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  oot) ) break;.  
6560: 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65 74 75  }.  if( p ) retu
6570: 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e  rn saveCursorsOn
6580: 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70  List(p, iRoot, p
6590: 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28 20 70  Except);.  if( p
65a0: 45 78 63 65 70 74 20 29 20 70 45 78 63 65 70 74  Except ) pExcept
65b0: 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42  ->curFlags &= ~B
65c0: 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20  TCF_Multiple;.  
65d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
65e0: 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c  ;.}../* This hel
65f0: 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f 20 73  per routine to s
6600: 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f  aveAllCursors do
6610: 65 73 20 74 68 65 20 61 63 74 75 61 6c 20 77 6f  es the actual wo
6620: 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20  rk of saving.** 
6630: 74 68 65 20 63 75 72 73 6f 72 73 20 69 66 20 61  the cursors if a
6640: 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73 6f 72  nd when a cursor
6650: 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74 20 61   is found that a
6660: 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72 65 73  ctually requires
6670: 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20   saving..** The 
6680: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73 20 74  common case is t
6690: 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e  hat no cursors n
66a0: 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64 2c  eed to be saved,
66b0: 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
66c0: 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75   is.** broken ou
66d0: 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65  t from its calle
66e0: 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63  r to avoid unnec
66f0: 65 73 73 61 72 79 20 73 74 61 63 6b 20 70 6f 69  essary stack poi
6700: 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a  nter movement..*
6710: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
6720: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76  ITE_NOINLINE sav
6730: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a  eCursorsOnList(.
6740: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c 20 20    BtCursor *p,  
6750: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
6760: 72 73 74 20 63 75 72 73 6f 72 20 74 68 61 74 20  rst cursor that 
6770: 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a  needs saving */.
6780: 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20    Pgno iRoot,   
6790: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73         /* Only s
67a0: 61 76 65 20 63 75 72 73 6f 72 20 77 69 74 68 20  ave cursor with 
67b0: 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61 76 65  this iRoot. Save
67c0: 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a   all if zero */.
67d0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63    BtCursor *pExc
67e0: 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  ept    /* Do not
67f0: 20 73 61 76 65 20 74 68 69 73 20 63 75 72 73 6f   save this curso
6800: 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20  r */.){.  do{.  
6810: 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74    if( p!=pExcept
6820: 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c   && (0==iRoot ||
6830: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
6840: 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66  oot) ){.      if
6850: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  ( p->eState==CUR
6860: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e  SOR_VALID || p->
6870: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
6880: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20  KIPNEXT ){.     
6890: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65     int rc = save
68a0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
68b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53  );.        if( S
68c0: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
68d0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
68e0: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
68f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6900: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
6910: 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 20  >iPage>=0 );.   
6920: 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73       btreeReleas
6930: 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
6940: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
6950: 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
6960: 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 20  xt;.  }while( p 
6970: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
6980: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6990: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
69a0: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
69b0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
69c0: 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
69d0: 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
69e0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
69f0: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
6a00: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
6a10: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
6a20: 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  y);.  pCur->pKey
6a30: 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53   = 0;.  pCur->eS
6a40: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6a50: 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
6a60: 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  In this version 
6a70: 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20  of BtreeMoveto, 
6a80: 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64  pKey is a packed
6a90: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a   index record.**
6aa0: 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65   such as is gene
6ab0: 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  rated by the OP_
6ac0: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
6ad0: 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a  e.  Unpack the.*
6ae0: 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  * record and the
6af0: 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65  n call BtreeMove
6b00: 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
6b10: 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a  do the work..*/.
6b20: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6b30: 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
6b40: 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
6b50: 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
6b60: 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  the btree to be 
6b70: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f  searched */.  co
6b80: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
6b90: 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20    /* Packed key 
6ba0: 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  if the btree is 
6bb0: 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36  an index */.  i6
6bc0: 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
6bd0: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79    /* Integer key
6be0: 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69   for tables.  Si
6bf0: 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69  ze of pKey for i
6c00: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
6c10: 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  bias,           
6c20: 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74  /* Bias search t
6c30: 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
6c40: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
6c50: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
6c60: 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
6c70: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
6c80: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
6c90: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
6ca0: 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61  s code */.  Unpa
6cb0: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
6cc0: 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b  Key;   /* Unpack
6cd0: 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
6ce0: 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
6cf0: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
6d00: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
6d10: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
6d20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
6d30: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
6d40: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b  pCur->pKeyInfo);
6d50: 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79  .    if( pIdxKey
6d60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
6d70: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
6d80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
6d90: 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72  ecordUnpack(pCur
6da0: 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74  ->pKeyInfo, (int
6db0: 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64  )nKey, pKey, pId
6dc0: 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70  xKey);.    if( p
6dd0: 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d  IdxKey->nField==
6de0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
6df0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
6e00: 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
6e10: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20 20 20  moveto_done;.   
6e20: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
6e30: 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  pIdxKey = 0;.  }
6e40: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
6e50: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6e60: 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79  ed(pCur, pIdxKey
6e70: 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52  , nKey, bias, pR
6e80: 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f 6e 65  es);.moveto_done
6e90: 3a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20  :.  if( pIdxKey 
6ea0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
6eb0: 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49  Free(pCur->pKeyI
6ec0: 6e 66 6f 2d 3e 64 62 2c 20 70 49 64 78 4b 65 79  nfo->db, pIdxKey
6ed0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6ee0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  rc;.}../*.** Res
6ef0: 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20  tore the cursor 
6f00: 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  to the position 
6f10: 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73  it was in (or as
6f20: 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73   close to as pos
6f30: 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73  sible).** when s
6f40: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
6f50: 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  n() was called. 
6f60: 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
6f70: 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20  all deletes the 
6f80: 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69  .** saved positi
6f90: 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62  on info stored b
6fa0: 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  y saveCursorPosi
6fb0: 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65  tion(), so there
6fc0: 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f   can be.** at mo
6fd0: 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65  st one effective
6fe0: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
6ff0: 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66  sition() call af
7000: 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76  ter each .** sav
7010: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7020: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
7030: 20 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72   btreeRestoreCur
7040: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
7050: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
7060: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69  nt rc;.  int ski
7070: 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28  pNext;.  assert(
7080: 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
7090: 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
70a0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
70b0: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
70c0: 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
70d0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
70e0: 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
70f0: 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
7100: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  skipNext;.  }.  
7110: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
7120: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
7130: 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74   rc = btreeMovet
7140: 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b  o(pCur, pCur->pK
7150: 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20  ey, pCur->nKey, 
7160: 30 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20  0, &skipNext);. 
7170: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7180: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
7190: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
71a0: 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b  y);.    pCur->pK
71b0: 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ey = 0;.    asse
71c0: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
71d0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
71e0: 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
71f0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
7200: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  ;.    pCur->skip
7210: 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74  Next |= skipNext
7220: 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
7230: 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75 72  skipNext && pCur
7240: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
7250: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  _VALID ){.      
7260: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
7270: 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a  URSOR_SKIPNEXT;.
7280: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7290: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e  rn rc;.}..#defin
72a0: 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  e restoreCursorP
72b0: 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28  osition(p) \.  (
72c0: 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  p->eState>=CURSO
72d0: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f 20  R_REQUIRESEEK ? 
72e0: 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65 65  \.         btree
72f0: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
7300: 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20  ition(p) : \.   
7310: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29        SQLITE_OK)
7320: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
7330: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
7340: 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f   a cursor has mo
7350: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73  ved from the pos
7360: 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69  ition where.** i
7370: 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65  t was last place
7380: 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20 69  d, or has been i
7390: 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20 61  nvalidated for a
73a0: 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e  ny other reason.
73b0: 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e 20  .** Cursors can 
73c0: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
73d0: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
73e0: 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74 65  ing at is delete
73f0: 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e  d out.** from un
7400: 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65 78  der them, for ex
7410: 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d  ample.  Cursor m
7420: 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69  ight also move i
7430: 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73 20  f a btree.** is 
7440: 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a  rebalanced..**.*
7450: 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * Calling this r
7460: 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e 55  outine with a NU
7470: 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 65  LL cursor pointe
7480: 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 2e  r returns false.
7490: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
74a0: 65 70 61 72 61 74 65 20 73 71 6c 69 74 65 33 42  eparate sqlite3B
74b0: 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72  treeCursorRestor
74c0: 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20 72  e() routine to r
74d0: 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72 0a  estore a cursor.
74e0: 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72 65  ** back to where
74f0: 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20   it ought to be 
7500: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
7510: 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f  returns true..*/
7520: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
7530: 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
7540: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
7550: 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
7560: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
7570: 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ALID;.}../*.** R
7580: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
7590: 74 6f 20 61 20 66 61 6b 65 20 42 74 43 75 72 73  to a fake BtCurs
75a0: 6f 72 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  or object that w
75b0: 69 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65  ill always answe
75c0: 72 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68  r.** false to th
75d0: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
75e0: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72  rsorHasMoved() r
75f0: 6f 75 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54  outine above.  T
7600: 68 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f  he fake.** curso
7610: 72 20 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20  r returned must 
7620: 6e 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68  not be used with
7630: 20 61 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65   any other Btree
7640: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42   interface..*/.B
7650: 74 43 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33  tCursor *sqlite3
7660: 42 74 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75  BtreeFakeValidCu
7670: 72 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74  rsor(void){.  st
7680: 61 74 69 63 20 75 38 20 66 61 6b 65 43 75 72 73  atic u8 fakeCurs
7690: 6f 72 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  or = CURSOR_VALI
76a0: 44 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  D;.  assert( off
76b0: 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20  setof(BtCursor, 
76c0: 65 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20  eState)==0 );.  
76d0: 72 65 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72  return (BtCursor
76e0: 2a 29 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d  *)&fakeCursor;.}
76f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
7700: 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20  tine restores a 
7710: 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69  cursor back to i
7720: 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69  ts original posi
7730: 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a  tion after it.**
7740: 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20   has been moved 
7750: 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20  by some outside 
7760: 61 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61  activity (such a
7770: 73 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61  s a btree rebala
7780: 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20  nce or.** a row 
7790: 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65  having been dele
77a0: 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
77b0: 65 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20  er the cursor). 
77c0: 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65   .**.** On succe
77d0: 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72  ss, the *pDiffer
77e0: 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72  entRow parameter
77f0: 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65   is false if the
7800: 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a   cursor is left.
7810: 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65  ** pointing at e
7820: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
7830: 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74  row.  *pDiffernt
7840: 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74  Row is the row t
7850: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
7860: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73   pointing to has
7870: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66   been deleted, f
7880: 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f  orcing the curso
7890: 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f  r to point to so
78a0: 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77  me.** nearby row
78b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
78c0: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tine should only
78d0: 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61   be called for a
78e0: 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73   cursor that jus
78f0: 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52  t returned.** TR
7900: 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42  UE from sqlite3B
7910: 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
7920: 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ed()..*/.int sql
7930: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52  ite3BtreeCursorR
7940: 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20  estore(BtCursor 
7950: 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66  *pCur, int *pDif
7960: 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e  ferentRow){.  in
7970: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
7980: 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73   pCur!=0 );.  as
7990: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
79a0: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
79b0: 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
79c0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
79d0: 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
79e0: 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   ){.    *pDiffer
79f0: 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  entRow = 1;.    
7a00: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
7a10: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
7a20: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
7a30: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
7a40: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c  ntRow = 1;.  }el
7a50: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
7a60: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
7a70: 30 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65  0 );.    *pDiffe
7a80: 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d  rentRow = 0;.  }
7a90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7aa0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
7ab0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
7ac0: 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20  SOR_HINTS./*.** 
7ad0: 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f  Provide hints to
7ae0: 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68   the cursor.  Th
7af0: 65 20 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e  e particular hin
7b00: 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65  t given (and the
7b10: 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d   type.** and num
7b20: 62 65 72 20 6f 66 20 74 68 65 20 76 61 72 61 72  ber of the varar
7b30: 67 73 20 70 61 72 61 6d 65 74 65 72 73 29 20 69  gs parameters) i
7b40: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
7b50: 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a  the eHintType.**
7b60: 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65   parameter.  See
7b70: 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73   the definitions
7b80: 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f 48 49   of the BTREE_HI
7b90: 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20  NT_* macros for 
7ba0: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64  details..*/.void
7bb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
7bc0: 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72  sorHint(BtCursor
7bd0: 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e   *pCur, int eHin
7be0: 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f  tType, ...){.  /
7bf0: 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73  * Used only by s
7c00: 79 73 74 65 6d 20 74 68 61 74 20 73 75 62 73 74  ystem that subst
7c10: 69 74 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20  itute their own 
7c20: 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a  storage engine *
7c30: 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  /.}.#endif../*.*
7c40: 2a 20 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68  * Provide flag h
7c50: 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73  ints to the curs
7c60: 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  or..*/.void sqli
7c70: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69  te3BtreeCursorHi
7c80: 6e 74 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72  ntFlags(BtCursor
7c90: 20 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64   *pCur, unsigned
7ca0: 20 78 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78   x){.  assert( x
7cb0: 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20  ==BTREE_SEEK_EQ 
7cc0: 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b  || x==BTREE_BULK
7cd0: 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a  LOAD || x==0 );.
7ce0: 20 20 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20    pCur->hints = 
7cf0: 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  x;.}...#ifndef S
7d00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
7d10: 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ACUUM./*.** Give
7d20: 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20  n a page number 
7d30: 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74  of a regular dat
7d40: 61 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75  abase page, retu
7d50: 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  rn the page.** n
7d60: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f  umber for the po
7d70: 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74  inter-map page t
7d80: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
7d90: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a   entry for the.*
7da0: 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d  * input page num
7db0: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ber..**.** Retur
7dc0: 6e 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64  n 0 (not a valid
7dd0: 20 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d   page) for pgno=
7de0: 3d 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69  =1 since there i
7df0: 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20  s.** no pointer 
7e00: 6d 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77  map associated w
7e10: 69 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65  ith page 1.  The
7e20: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
7e30: 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72   logic.** requir
7e40: 65 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61  es that ptrmapPa
7e50: 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f  geno(*,1)!=1..*/
7e60: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72  .static Pgno ptr
7e70: 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72  mapPageno(BtShar
7e80: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
7e90: 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65  no){.  int nPage
7ea0: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50  sPerMapPage;.  P
7eb0: 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74  gno iPtrMap, ret
7ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7ed0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7ee0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7ef0: 69 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74  if( pgno<2 ) ret
7f00: 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50  urn 0;.  nPagesP
7f10: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
7f20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
7f30: 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28  1;.  iPtrMap = (
7f40: 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65  pgno-2)/nPagesPe
7f50: 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20  rMapPage;.  ret 
7f60: 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65  = (iPtrMap*nPage
7f70: 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32  sPerMapPage) + 2
7f80: 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45  ; .  if( ret==PE
7f90: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
7fa0: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b  pBt) ){.    ret+
7fb0: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
7fc0: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ret;.}../*.** Wr
7fd0: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
7fe0: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
7ff0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
8000: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
8010: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
8020: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
8030: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
8040: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
8050: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
8060: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
8070: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a  ber 'pgno'..**.*
8080: 2a 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69  * If *pRC is ini
8090: 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20  tially non-zero 
80a0: 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20  (non-SQLITE_OK) 
80b0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
80c0: 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  e is.** a no-op.
80d0: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
80e0: 63 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70  curs, the approp
80f0: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
8100: 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
8110: 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61  nto *pRC..*/.sta
8120: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
8130: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
8140: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
8150: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
8160: 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  t, int *pRC){.  
8170: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
8180: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
8190: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75   map page */.  u
81a0: 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20  8 *pPtrmap;     
81b0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
81c0: 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67  map data */.  Pg
81d0: 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  no iPtrmap;     
81e0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
81f0: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ap page number *
8200: 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20  /.  int offset; 
8210: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8220: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  in pointer map p
8230: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
8240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
8250: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
8260: 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a  ubfunctions */..
8270: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
8280: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
8290: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
82a0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
82b0: 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65  ;.  /* The maste
82c0: 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e  r-journal page n
82d0: 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72  umber must never
82e0: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f   be used as a po
82f0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
8300: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50  /.  assert( 0==P
8310: 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
8320: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  , PENDING_BYTE_P
8330: 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20  AGE(pBt)) );..  
8340: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
8350: 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28  oVacuum );.  if(
8360: 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a   key==0 ){.    *
8370: 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
8380: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
8390: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74  eturn;.  }.  iPt
83a0: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
83b0: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
83c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
83d0: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
83e0: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
83f0: 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  bPage, 0);.  if(
8400: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8410: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
8420: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8430: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8440: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8450: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8460: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8470: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
8480: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8490: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
84a0: 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  it;.  }.  assert
84b0: 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74  ( offset <= (int
84c0: 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
84d0: 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20  -5 );.  pPtrmap 
84e0: 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50  = (u8 *)sqlite3P
84f0: 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
8500: 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79  age);..  if( eTy
8510: 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73  pe!=pPtrmap[offs
8520: 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28  et] || get4byte(
8530: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
8540: 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20  1])!=parent ){. 
8550: 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41     TRACE(("PTRMA
8560: 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25  P_UPDATE: %d->(%
8570: 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65  d,%d)\n", key, e
8580: 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a  Type, parent));.
8590: 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73      *pRC= rc = s
85a0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
85b0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
85c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
85d0: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
85e0: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
85f0: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
8600: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
8610: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
8620: 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70     }.  }..ptrmap
8630: 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33  _exit:.  sqlite3
8640: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
8650: 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
8660: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
8670: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
8680: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8690: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
86a0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
86b0: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
86c0: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
86d0: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
86e0: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
86f0: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
8700: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
8710: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
8720: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
8730: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
8740: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
8750: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
8760: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
8770: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
8780: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
8790: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
87a0: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
87b0: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
87c0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
87d0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
87e0: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
87f0: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
8800: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
8810: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
8820: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
8830: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
8840: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
8850: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
8860: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
8870: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
8880: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
8890: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
88a0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
88b0: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
88c0: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
88d0: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
88e0: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
88f0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
8900: 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20   &pDbPage, 0);. 
8910: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
8920: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
8930: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
8940: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
8950: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
8960: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
8970: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
8980: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
8990: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
89a0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
89b0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
89c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
89d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
89e0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
89f0: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
8a00: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
8a10: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
8a20: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
8a30: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
8a40: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
8a50: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
8a60: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
8a70: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
8a80: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
8a90: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
8aa0: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
8ab0: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
8ac0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
8ad0: 4e 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72  NO(iPtrmap);.  r
8ae0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8af0: 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  .}..#else /* if 
8b00: 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f  defined SQLITE_O
8b10: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
8b20: 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  /.  #define ptrm
8b30: 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63  apPut(w,x,y,z,rc
8b40: 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  ).  #define ptrm
8b50: 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53  apGet(w,x,y,z) S
8b60: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
8b70: 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  ne ptrmapPutOvfl
8b80: 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65  Ptr(x, y, rc).#e
8b90: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ndif../*.** Give
8ba0: 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61  n a btree page a
8bb0: 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20  nd a cell index 
8bc0: 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72  (0 means the fir
8bd0: 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68  st cell on.** th
8be0: 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20  e page, 1 means 
8bf0: 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c  the second cell,
8c00: 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72   and so forth) r
8c10: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
8c20: 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  ** to the cell c
8c30: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69  ontent..**.** fi
8c40: 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20  ndCellPastPtr() 
8c50: 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 65 78  does the same ex
8c60: 63 65 70 74 20 69 74 20 73 6b 69 70 73 20 70 61  cept it skips pa
8c70: 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  st the initial.*
8c80: 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70  * 4-byte child p
8c90: 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20  ointer found on 
8ca0: 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20  interior pages, 
8cb0: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
8cc0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8cd0: 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66  ine works only f
8ce0: 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f  or pages that do
8cf0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65   not contain ove
8d00: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
8d10: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
8d20: 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e  (P,I) \.  ((P)->
8d30: 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61  aData + ((P)->ma
8d40: 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74  skPage & get2byt
8d50: 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61  eAligned(&(P)->a
8d60: 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29  CellIdx[2*(I)]))
8d70: 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  ).#define findCe
8d80: 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c  llPastPtr(P,I) \
8d90: 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66  .  ((P)->aDataOf
8da0: 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  st + ((P)->maskP
8db0: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41 6c  age & get2byteAl
8dc0: 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c  igned(&(P)->aCel
8dd0: 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a  lIdx[2*(I)])))..
8de0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
8df0: 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65  ommon tail proce
8e00: 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50  ssing for btreeP
8e10: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
8e20: 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  d.** btreeParseC
8e30: 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f  ellPtrIndex() fo
8e40: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20  r the case when 
8e50: 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f  the cell does no
8e60: 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a  t fit entirely.*
8e70: 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d  * on a single B-
8e80: 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65  tree page.  Make
8e90: 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73   necessary adjus
8ea0: 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65  tments to the Ce
8eb0: 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  llInfo.** struct
8ec0: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ure..*/.static S
8ed0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
8ee0: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
8ef0: 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f  llAdjustSizeForO
8f00: 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61  verflow(.  MemPa
8f10: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
8f20: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
8f30: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
8f40: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8f60: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
8f70: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
8f80: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
8f90: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
8fa0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
8fb0: 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68  */.){.  /* If th
8fc0: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
8fd0: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
8fe0: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
8ff0: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a  age, we have.  *
9000: 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20  * to decide how 
9010: 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f  much to store lo
9020: 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75  cally and how mu
9030: 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f  ch to spill onto
9040: 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70  .  ** overflow p
9050: 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74  ages.  The strat
9060: 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69  egy is to minimi
9070: 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ze the amount of
9080: 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61   unused.  ** spa
9090: 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce on overflow p
90a0: 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69  ages while keepi
90b0: 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ng the amount of
90c0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20   local storage. 
90d0: 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d   ** in between m
90e0: 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c  inLocal and maxL
90f0: 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ocal..  **.  ** 
9100: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
9110: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
9120: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
9130: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
9140: 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20  y.  ** way will 
9150: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
9160: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
9170: 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e  ormat..  */.  in
9180: 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t minLocal;  /* 
9190: 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Minimum amount o
91a0: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
91b0: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
91c0: 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61  maxLocal;  /* Ma
91d0: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
91e0: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
91f0: 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ally */.  int su
9200: 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72  rplus;   /* Over
9210: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61  flow payload ava
9220: 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c  ilable for local
9230: 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d   storage */..  m
9240: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
9250: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78  >minLocal;.  max
9260: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
9270: 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c  axLocal;.  surpl
9280: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
9290: 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64  (pInfo->nPayload
92a0: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
92b0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
92c0: 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63  Size-4);.  testc
92d0: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
92e0: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
92f0: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
9300: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
9310: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
9320: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49  xLocal ){.    pI
9330: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
9340: 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65  16)surplus;.  }e
9350: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  lse{.    pInfo->
9360: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69  nLocal = (u16)mi
9370: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49  nLocal;.  }.  pI
9380: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31  nfo->nSize = (u1
9390: 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  6)(&pInfo->pPayl
93a0: 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  oad[pInfo->nLoca
93b0: 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b  l] - pCell) + 4;
93c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
93d0: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
93e0: 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   are implementat
93f0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  ions of the MemP
9400: 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c 28 29  age.xParseCell()
9410: 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a  .** method..**.*
9420: 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63  * Parse a cell c
9430: 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64  ontent block and
9440: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c   fill in the Cel
9450: 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  lInfo structure.
9460: 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  .**.** btreePars
9470: 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20 20 20  eCellPtr()      
9480: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72    =>   table btr
9490: 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a  ee leaf nodes.**
94a0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 4e   btreeParseCellN
94b0: 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20  oPayload()  =>  
94c0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 69 6e 74   table btree int
94d0: 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62  ernal nodes.** b
94e0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
94f0: 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20 20 69  Index()   =>   i
9500: 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64 65 73  ndex btree nodes
9510: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
9520: 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72 20 66  also a wrapper f
9530: 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50 61 72  unction btreePar
9540: 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f  seCell() that wo
9550: 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d  rks for.** all M
9560: 65 6d 50 61 67 65 20 74 79 70 65 73 20 61 6e 64  emPage types and
9570: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
9580: 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69 6e 64   the cell by ind
9590: 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 0a 2a  ex rather than.*
95a0: 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  * by pointer..*/
95b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
95c0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f  eeParseCellPtrNo
95d0: 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61  Payload(.  MemPa
95e0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
95f0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
9600: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
9610: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
9620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9630: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
9640: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
9650: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
9660: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
9670: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
9680: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
9690: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
96a0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
96b0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
96c0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
96d0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
96e0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
96f0: 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66  ze==4 );.#ifndef
9700: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
9710: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
9720: 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a  (pPage);.#endif.
9730: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
9740: 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26   4 + getVarint(&
9750: 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29  pCell[4], (u64*)
9760: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
9770: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
9780: 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e   = 0;.  pInfo->n
9790: 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e  Local = 0;.  pIn
97a0: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30  fo->pPayload = 0
97b0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74  ;.  return;.}.st
97c0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
97d0: 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d  arseCellPtr(.  M
97e0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
97f0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
9800: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
9810: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
9820: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9830: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
9840: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
9850: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
9860: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
9870: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
9880: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
9890: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
98a0: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
98b0: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
98c0: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
98d0: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
98e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
98f0: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
9900: 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b  d */.  u64 iKey;
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9920: 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65 79 20  * Extracted Key 
9930: 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65  value */..  asse
9940: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9950: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
9960: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
9970: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
9980: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
9990: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73  leaf==1 );.  ass
99a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
99b0: 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65  eyLeaf );.  asse
99c0: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
99d0: 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  PtrSize==0 );.  
99e0: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a  pIter = pCell;..
99f0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c    /* The next bl
9a00: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65  ock of code is e
9a10: 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20  quivalent to:.  
9a20: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65  **.  **     pIte
9a30: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
9a40: 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64  (pIter, nPayload
9a50: 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  );.  **.  ** The
9a60: 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64   code is inlined
9a70: 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63   to avoid a func
9a80: 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a  tion call..  */.
9a90: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49    nPayload = *pI
9aa0: 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  ter;.  if( nPayl
9ab0: 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  oad>=0x80 ){.   
9ac0: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74   u8 *pEnd = &pIt
9ad0: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c  er[8];.    nPayl
9ae0: 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  oad &= 0x7f;.   
9af0: 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c   do{.      nPayl
9b00: 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c  oad = (nPayload<
9b10: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
9b20: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
9b30: 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30  ile( (*pIter)>=0
9b40: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
9b50: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
9b60: 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65  ++;..  /* The ne
9b70: 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  xt block of code
9b80: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
9b90: 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
9ba0: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
9bb0: 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a  int(pIter, (u64*
9bc0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
9bd0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f    **.  ** The co
9be0: 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f  de is inlined to
9bf0: 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f   avoid a functio
9c00: 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69  n call..  */.  i
9c10: 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  Key = *pIter;.  
9c20: 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29  if( iKey>=0x80 )
9c30: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d  {.    u8 *pEnd =
9c40: 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20   &pIter[7];.    
9c50: 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20  iKey &= 0x7f;.  
9c60: 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20    while(1){.    
9c70: 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c    iKey = (iKey<<
9c80: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
9c90: 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66   0x7f);.      if
9ca0: 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20  ( (*pIter)<0x80 
9cb0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
9cc0: 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29  f( pIter>=pEnd )
9cd0: 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d  {.        iKey =
9ce0: 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b   (iKey<<8) | *++
9cf0: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62  pIter;.        b
9d00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
9d10: 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b    }.  }.  pIter+
9d20: 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65  +;..  pInfo->nKe
9d30: 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79  y = *(i64*)&iKey
9d40: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  ;.  pInfo->nPayl
9d50: 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  oad = nPayload;.
9d60: 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61    pInfo->pPayloa
9d70: 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73  d = pIter;.  tes
9d80: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
9d90: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9da0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9db0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9dc0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
9dd0: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
9de0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
9df0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
9e00: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
9e10: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
9e20: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
9e30: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
9e40: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
9e50: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
9e60: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
9e70: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
9e80: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28  e = nPayload + (
9e90: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
9ea0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ll);.    if( pIn
9eb0: 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49  fo->nSize<4 ) pI
9ec0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
9ed0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
9ee0: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
9ef0: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
9f00: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64  btreeParseCellAd
9f10: 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66  justSizeForOverf
9f20: 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  low(pPage, pCell
9f30: 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a  , pInfo);.  }.}.
9f40: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9f50: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64  eParseCellPtrInd
9f60: 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ex(.  MemPage *p
9f70: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
9f80: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
9f90: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
9fa0: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
9fb0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9fc0: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
9fd0: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
9fe0: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
9ff0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
a000: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
a010: 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20  .  u8 *pIter;   
a020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
a030: 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  r scanning throu
a040: 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33  gh pCell */.  u3
a050: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
a060: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a070: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
a080: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
a090: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
a0a0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
a0b0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
a0c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a0d0: 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67  >leaf==0 || pPag
a0e0: 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20  e->leaf==1 );.  
a0f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
a100: 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a  ntKeyLeaf==0 );.
a110: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20    pIter = pCell 
a120: 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
a130: 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61  rSize;.  nPayloa
a140: 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  d = *pIter;.  if
a150: 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30  ( nPayload>=0x80
a160: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
a170: 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20   = &pIter[8];.  
a180: 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78    nPayload &= 0x
a190: 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  7f;.    do{.    
a1a0: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50    nPayload = (nP
a1b0: 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b  ayload<<7) | (*+
a1c0: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
a1d0: 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49      }while( *(pI
a1e0: 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49  ter)>=0x80 && pI
a1f0: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
a200: 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e    pIter++;.  pIn
a210: 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c  fo->nKey = nPayl
a220: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  oad;.  pInfo->nP
a230: 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61  ayload = nPayloa
a240: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  d;.  pInfo->pPay
a250: 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20  load = pIter;.  
a260: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
a270: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
a280: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
a290: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
a2a0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
a2b0: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
a2c0: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
a2d0: 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  l ){.    /* This
a2e0: 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63   is the (easy) c
a2f0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
a300: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c   the entire payl
a310: 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20  oad fits.    ** 
a320: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
a330: 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20  e.  No overflow 
a340: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
a350: 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   */.    pInfo->n
a360: 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20  Size = nPayload 
a370: 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  + (u16)(pIter - 
a380: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
a390: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29  pInfo->nSize<4 )
a3a0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
a3b0: 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  4;.    pInfo->nL
a3c0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79  ocal = (u16)nPay
a3d0: 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  load;.  }else{. 
a3e0: 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
a3f0: 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76  lAdjustSizeForOv
a400: 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43  erflow(pPage, pC
a410: 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d  ell, pInfo);.  }
a420: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  .}.static void b
a430: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20  treeParseCell(. 
a440: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
a450: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
a460: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
a470: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43  cell */.  int iC
a480: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
a490: 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e    /* The cell in
a4a0: 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c  dex.  First cell
a4b0: 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49   is 0 */.  CellI
a4c0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
a4d0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
a4e0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
a4f0: 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  ){.  pPage->xPar
a500: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69  seCell(pPage, fi
a510: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
a520: 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a  ell), pInfo);.}.
a530: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
a540: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
a550: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
a560: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
a570: 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65  .xCellSize.** me
a580: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  thod..**.** Comp
a590: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ute the total nu
a5a0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68  mber of bytes th
a5b0: 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20  at a Cell needs 
a5c0: 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  in the cell.** d
a5d0: 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20  ata area of the 
a5e0: 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65  btree-page.  The
a5f0: 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69   return number i
a600: 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c  ncludes the cell
a610: 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20  .** data header 
a620: 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61  and the local pa
a630: 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61  yload, but not a
a640: 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
a650: 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65   or.** the space
a660: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c   used by the cel
a670: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  l pointer..**.**
a680: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
a690: 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20  yload()    =>   
a6a0: 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e  table internal n
a6b0: 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65  odes.** cellSize
a6c0: 50 74 72 28 29 20 20 20 20 20 20 20 20 20 20 20  Ptr()           
a6d0: 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78    =>   all index
a6e0: 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c   nodes & table l
a6f0: 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61  eaf nodes.*/.sta
a700: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
a710: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
a720: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
a730: 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43    u8 *pIter = pC
a740: 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  ell + pPage->chi
a750: 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f  ldPtrSize; /* Fo
a760: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62  r looping over b
a770: 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f  ytes of pCell */
a780: 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20  .  u8 *pEnd;    
a790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
a7b0: 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61  nd mark for a va
a7c0: 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53  rint */.  u32 nS
a7d0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7f0: 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65     /* Size value
a800: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23   to return */..#
a810: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a820: 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  UG.  /* The valu
a830: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
a840: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
a850: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ld always be the
a860: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68   same as.  ** th
a870: 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a  e (CellInfo.nSiz
a880: 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62  e) value found b
a890: 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70  y doing a full p
a8a0: 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  arse of the.  **
a8b0: 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45   cell. If SQLITE
a8c0: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
a8d0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61  d, an assert() a
a8e0: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a  t the bottom of.
a8f0: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
a900: 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74  on verifies that
a910: 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   this invariant 
a920: 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e  is not violated.
a930: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64   */.  CellInfo d
a940: 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67  ebuginfo;.  pPag
a950: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
a960: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62  age, pCell, &deb
a970: 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a  uginfo);.#endif.
a980: 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65  .  nSize = *pIte
a990: 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d  r;.  if( nSize>=
a9a0: 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64  0x80 ){.    pEnd
a9b0: 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20   = &pIter[8];.  
a9c0: 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b    nSize &= 0x7f;
a9d0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
a9e0: 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37  Size = (nSize<<7
a9f0: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
aa00: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
aa10: 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38  e( *(pIter)>=0x8
aa20: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
aa30: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
aa40: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
aa50: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
aa60: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
aa70: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
aa80: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
aa90: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
aaa0: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
aab0: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
aac0: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
aad0: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
aae0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
aaf0: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
ab00: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
ab10: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
ab20: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
ab30: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
ab40: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
ab50: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
ab60: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
ab70: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
ab80: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
ab90: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
aba0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
abb0: 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d  f( nSize<=pPage-
abc0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
abd0: 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28   nSize += (u32)(
abe0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
abf0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20      if( nSize<4 
ac00: 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d  ) nSize = 4;.  }
ac10: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69  else{.    int mi
ac20: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
ac30: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53  minLocal;.    nS
ac40: 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  ize = minLocal +
ac50: 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63   (nSize - minLoc
ac60: 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  al) % (pPage->pB
ac70: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
ac80: 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
ac90: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
aca0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  maxLocal );.    
acb0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
acc0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
acd0: 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  +1 );.    if( nS
ace0: 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ize>pPage->maxLo
acf0: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  cal ){.      nSi
ad00: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  ze = minLocal;. 
ad10: 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b     }.    nSize +
ad20: 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49 74 65  = 4 + (u16)(pIte
ad30: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a  r - pCell);.  }.
ad40: 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d    assert( nSize=
ad50: 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65  =debuginfo.nSize
ad60: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
ad70: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
ad80: 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20  nSize;.}.static 
ad90: 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e  u16 cellSizePtrN
ada0: 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65  oPayload(MemPage
adb0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
adc0: 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  ll){.  u8 *pIter
add0: 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a   = pCell + 4; /*
ade0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
adf0: 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c  r bytes of pCell
ae00: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20   */.  u8 *pEnd; 
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae20: 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76  End mark for a v
ae30: 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66  arint */..#ifdef
ae40: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
ae50: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  /* The value ret
ae60: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
ae70: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  nction should al
ae80: 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65  ways be the same
ae90: 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65   as.  ** the (Ce
aea0: 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61  llInfo.nSize) va
aeb0: 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69  lue found by doi
aec0: 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20  ng a full parse 
aed0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  of the.  ** cell
aee0: 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55  . If SQLITE_DEBU
aef0: 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  G is defined, an
af00: 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65   assert() at the
af10: 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20   bottom of.  ** 
af20: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65  this function ve
af30: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73  rifies that this
af40: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f   invariant is no
af50: 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20  t violated. */. 
af60: 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69   CellInfo debugi
af70: 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  nfo;.  pPage->xP
af80: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
af90: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
afa0: 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  o);.#else.  UNUS
afb0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61  ED_PARAMETER(pPa
afc0: 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ge);.#endif..  a
afd0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
afe0: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
aff0: 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20  .  pEnd = pIter 
b000: 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a  + 9;.  while( (*
b010: 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26  pIter++)&0x80 &&
b020: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
b030: 20 61 73 73 65 72 74 28 20 64 65 62 75 67 69 6e   assert( debugin
b040: 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28  fo.nSize==(u16)(
b050: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c  pIter - pCell) |
b060: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
b070: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28 70    return (u16)(p
b080: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d  Iter - pCell);.}
b090: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
b0a0: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76  _DEBUG./* This v
b0b0: 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c  ariation on cell
b0c0: 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65  SizePtr() is use
b0d0: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
b0e0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a  rt() statements.
b0f0: 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74  ** only. */.stat
b100: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28  ic u16 cellSize(
b110: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
b120: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65  int iCell){.  re
b130: 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c  turn pPage->xCel
b140: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e  lSize(pPage, fin
b150: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
b160: 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ll));.}.#endif..
b170: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b180: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
b190: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
b1a0: 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20   pCell, part of 
b1b0: 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61  page pPage conta
b1c0: 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  ins a pointer.**
b1d0: 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
b1e0: 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20  page, insert an 
b1f0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
b200: 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f  ointer-map.** fo
b210: 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
b220: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
b230: 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66  oid ptrmapPutOvf
b240: 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  lPtr(MemPage *pP
b250: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20  age, u8 *pCell, 
b260: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c  int *pRC){.  Cel
b270: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66  lInfo info;.  if
b280: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
b290: 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
b2a0: 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  !=0 );.  pPage->
b2b0: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
b2c0: 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
b2d0: 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63  .  if( info.nLoc
b2e0: 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  al<info.nPayload
b2f0: 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66   ){.    Pgno ovf
b300: 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
b310: 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell[info.nSize-4
b320: 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
b330: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
b340: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
b350: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
b360: 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23  o, pRC);.  }.}.#
b370: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
b380: 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67  fragment the pag
b390: 65 20 67 69 76 65 6e 2e 20 54 68 69 73 20 72 6f  e given. This ro
b3a0: 75 74 69 6e 65 20 72 65 6f 72 67 61 6e 69 7a 65  utine reorganize
b3b0: 73 20 63 65 6c 6c 73 20 77 69 74 68 69 6e 20 74  s cells within t
b3c0: 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f 20 74 68  he.** page so th
b3d0: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
b3e0: 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f 6e 20 74  free-blocks on t
b3f0: 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6c 69  he free-block li
b400: 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  st..**.** Parame
b410: 74 65 72 20 6e 4d 61 78 46 72 61 67 20 69 73 20  ter nMaxFrag is 
b420: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
b430: 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  nt of fragmented
b440: 20 73 70 61 63 65 20 74 68 61 74 20 6d 61 79 20   space that may 
b450: 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e  be.** present in
b460: 20 74 68 65 20 70 61 67 65 20 61 66 74 65 72 20   the page after 
b470: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
b480: 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44  urns..**.** EVID
b490: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32  ENCE-OF: R-44582
b4a0: 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20 6d 61  -60138 SQLite ma
b4b0: 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74  y from time to t
b4c0: 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65 20 61  ime reorganize a
b4d0: 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 20  .** b-tree page 
b4e0: 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 61 72  so that there ar
b4f0: 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20  e no freeblocks 
b500: 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79 74 65  or fragment byte
b510: 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64  s, all.** unused
b520: 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e 74 61   bytes are conta
b530: 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e 61 6c  ined in the unal
b540: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20 72 65  located space re
b550: 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a  gion, and all.**
b560: 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63 6b 65   cells are packe
b570: 64 20 74 69 67 68 74 6c 79 20 61 74 20 74 68 65  d tightly at the
b580: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
b590: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b5a0: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
b5b0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
b5c0: 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b 0a 20 20  nt nMaxFrag){.  
b5d0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
b5e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
b5f0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
b600: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
b610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
b620: 64 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74  dress of the i-t
b630: 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  h cell */.  int 
b640: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
b650: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
b660: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
b670: 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a  der */.  int siz
b680: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
b690: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
b6a0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75   cell */.  int u
b6b0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  sableSize;      
b6c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b6d0: 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20  of usable bytes 
b6e0: 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  on a page */.  i
b6f0: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
b700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
b710: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
b720: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
b730: 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20  .  int cbrk;    
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b750: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
b760: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
b770: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b790: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
b7a0: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  lls on the page 
b7b0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
b7c0: 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ar *data;       
b7d0: 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61  /* The page data
b7e0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
b7f0: 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20  har *temp;      
b800: 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f   /* Temp area fo
b810: 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  r cell content *
b820: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
b830: 72 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f  r *src;        /
b840: 2a 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74  * Source of cont
b850: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ent */.  int iCe
b860: 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  llFirst;        
b870: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
b880: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  owable cell inde
b890: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  x */.  int iCell
b8a0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
b8b0: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
b8c0: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
b8d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
b8e0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
b8f0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
b900: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
b910: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
b920: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
b930: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
b940: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
b950: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
b960: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
b970: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
b980: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b990: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
b9a0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
b9b0: 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20  ;.  temp = 0;.  
b9c0: 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61  src = data = pPa
b9d0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
b9e0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
b9f0: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
ba00: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
ba10: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
ba20: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
ba30: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
ba40: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
ba50: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 69 43 65 6c  dr+3]) );.  iCel
ba60: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
ba70: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20  set + 2*nCell;. 
ba80: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
ba90: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
baa0: 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  Size;..  /* This
bab0: 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 20 70   block handles p
bac0: 61 67 65 73 20 77 69 74 68 20 74 77 6f 20 6f 72  ages with two or
bad0: 20 66 65 77 65 72 20 66 72 65 65 20 62 6c 6f 63   fewer free bloc
bae0: 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72 61 67 0a  ks and nMaxFrag.
baf0: 20 20 2a 2a 20 6f 72 20 66 65 77 65 72 20 66 72    ** or fewer fr
bb00: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 2e 20  agmented bytes. 
bb10: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  In this case it 
bb20: 69 73 20 66 61 73 74 65 72 20 74 6f 20 6d 6f 76  is faster to mov
bb30: 65 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 28  e the.  ** two (
bb40: 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b 73 20 6f  or one) blocks o
bb50: 66 20 63 65 6c 6c 73 20 75 73 69 6e 67 20 6d 65  f cells using me
bb60: 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61 64 64 20  mmove() and add 
bb70: 74 68 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a  the required.  *
bb80: 2a 20 6f 66 66 73 65 74 73 20 74 6f 20 65 61 63  * offsets to eac
bb90: 68 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  h pointer in the
bba0: 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
bbb0: 72 61 79 20 74 68 61 6e 20 69 74 20 69 73 20 74  ray than it is t
bbc0: 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e 73 74 72  o .  ** reconstr
bbd0: 75 63 74 20 74 68 65 20 65 6e 74 69 72 65 20 70  uct the entire p
bbe0: 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28  age.  */.  if( (
bbf0: 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 3c  int)data[hdr+7]<
bc00: 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a 20 20 20  =nMaxFrag ){.   
bc10: 20 69 6e 74 20 69 46 72 65 65 20 3d 20 67 65 74   int iFree = get
bc20: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
bc30: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 46 72  1]);.    if( iFr
bc40: 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ee ){.      int 
bc50: 69 46 72 65 65 32 20 3d 20 67 65 74 32 62 79 74  iFree2 = get2byt
bc60: 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d 29 3b  e(&data[iFree]);
bc70: 0a 0a 20 20 20 20 20 20 2f 2a 20 70 61 67 65 46  ..      /* pageF
bc80: 69 6e 64 53 6c 6f 74 28 29 20 68 61 73 20 61 6c  indSlot() has al
bc90: 72 65 61 64 79 20 76 65 72 69 66 69 65 64 20 74  ready verified t
bca0: 68 61 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  hat free blocks 
bcb0: 61 72 65 20 73 6f 72 74 65 64 0a 20 20 20 20 20  are sorted.     
bcc0: 20 2a 2a 20 69 6e 20 6f 72 64 65 72 20 6f 66 20   ** in order of 
bcd0: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74 68  offset within th
bce0: 65 20 70 61 67 65 2c 20 61 6e 64 20 74 68 61 74  e page, and that
bcf0: 20 6e 6f 20 62 6c 6f 63 6b 20 65 78 74 65 6e 64   no block extend
bd00: 73 0a 20 20 20 20 20 20 2a 2a 20 70 61 73 74 20  s.      ** past 
bd10: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
bd20: 61 67 65 2e 20 50 72 6f 76 69 64 65 64 20 74 68  age. Provided th
bd30: 65 20 74 77 6f 20 66 72 65 65 20 73 6c 6f 74 73  e two free slots
bd40: 20 64 6f 20 6e 6f 74 20 0a 20 20 20 20 20 20 2a   do not .      *
bd50: 2a 20 6f 76 65 72 6c 61 70 2c 20 74 68 69 73 20  * overlap, this 
bd60: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
bd70: 74 68 65 20 6d 65 6d 6d 6f 76 65 28 29 20 63 61  the memmove() ca
bd80: 6c 6c 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  lls below will n
bd90: 6f 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  ot.      ** over
bda0: 77 72 69 74 65 20 74 68 65 20 75 73 61 62 6c 65  write the usable
bdb0: 53 69 7a 65 20 62 79 74 65 20 62 75 66 66 65 72  Size byte buffer
bdc0: 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 64 61  , even if the da
bdd0: 74 61 62 61 73 65 20 70 61 67 65 0a 20 20 20 20  tabase page.    
bde0: 20 20 2a 2a 20 69 73 20 63 6f 72 72 75 70 74 2e    ** is corrupt.
bdf0: 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
be00: 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c 20  t( iFree2==0 || 
be10: 69 46 72 65 65 32 3e 69 46 72 65 65 20 29 3b 0a  iFree2>iFree );.
be20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
be30: 72 65 65 2b 67 65 74 32 62 79 74 65 28 26 64 61  ree+get2byte(&da
be40: 74 61 5b 69 46 72 65 65 2b 32 5d 29 20 3c 3d 20  ta[iFree+2]) <= 
be50: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
be60: 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
be70: 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 2b  e2==0 || iFree2+
be80: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
be90: 46 72 65 65 32 2b 32 5d 29 20 3c 3d 20 75 73 61  Free2+2]) <= usa
bea0: 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  bleSize );..    
beb0: 20 20 69 66 28 20 30 3d 3d 69 46 72 65 65 32 20    if( 0==iFree2 
bec0: 7c 7c 20 28 64 61 74 61 5b 69 46 72 65 65 32 5d  || (data[iFree2]
bed0: 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 46 72 65  ==0 && data[iFre
bee0: 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20 20 20  e2+1]==0) ){.   
bef0: 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20       u8 *pEnd = 
bf00: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
bf10: 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20   + nCell*2];.   
bf20: 20 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 0a       u8 *pAddr;.
bf30: 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 32 20          int sz2 
bf40: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
bf50: 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26   sz = get2byte(&
bf60: 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29 3b 0a  data[iFree+2]);.
bf70: 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f 70 20          int top 
bf80: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
bf90: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
bfa0: 20 20 69 66 28 20 74 6f 70 3e 3d 69 46 72 65 65    if( top>=iFree
bfb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
bfc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bfd0: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
bfe0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bff0: 20 20 20 69 66 28 20 69 46 72 65 65 32 20 29 7b     if( iFree2 ){
c000: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
c010: 74 28 20 69 46 72 65 65 2b 73 7a 3c 3d 69 46 72  t( iFree+sz<=iFr
c020: 65 65 32 20 29 3b 20 2f 2a 20 56 65 72 69 66 69  ee2 ); /* Verifi
c030: 65 64 20 62 79 20 70 61 67 65 46 69 6e 64 53 6c  ed by pageFindSl
c040: 6f 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  ot() */.        
c050: 20 20 73 7a 32 20 3d 20 67 65 74 32 62 79 74 65    sz2 = get2byte
c060: 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d  (&data[iFree2+2]
c070: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
c080: 65 72 74 28 20 69 46 72 65 65 2b 73 7a 2b 73 7a  ert( iFree+sz+sz
c090: 32 2b 69 46 72 65 65 32 2d 28 69 46 72 65 65 2b  2+iFree2-(iFree+
c0a0: 73 7a 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a  sz) <= usableSiz
c0b0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  e );.          m
c0c0: 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69 46 72  emmove(&data[iFr
c0d0: 65 65 2b 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74  ee+sz+sz2], &dat
c0e0: 61 5b 69 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72  a[iFree+sz], iFr
c0f0: 65 65 32 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b  ee2-(iFree+sz));
c100: 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 2b 3d  .          sz +=
c110: 20 73 7a 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   sz2;.        }.
c120: 20 20 20 20 20 20 20 20 63 62 72 6b 20 3d 20 74          cbrk = t
c130: 6f 70 2b 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  op+sz;.        a
c140: 73 73 65 72 74 28 20 63 62 72 6b 2b 28 69 46 72  ssert( cbrk+(iFr
c150: 65 65 2d 74 6f 70 29 20 3c 3d 20 75 73 61 62 6c  ee-top) <= usabl
c160: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
c170: 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 63   memmove(&data[c
c180: 62 72 6b 5d 2c 20 26 64 61 74 61 5b 74 6f 70 5d  brk], &data[top]
c190: 2c 20 69 46 72 65 65 2d 74 6f 70 29 3b 0a 20 20  , iFree-top);.  
c1a0: 20 20 20 20 20 20 66 6f 72 28 70 41 64 64 72 3d        for(pAddr=
c1b0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
c1c0: 5d 3b 20 70 41 64 64 72 3c 70 45 6e 64 3b 20 70  ]; pAddr<pEnd; p
c1d0: 41 64 64 72 2b 3d 32 29 7b 0a 20 20 20 20 20 20  Addr+=2){.      
c1e0: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
c1f0: 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 20 20  e(pAddr);.      
c200: 20 20 20 20 69 66 28 20 70 63 3c 69 46 72 65 65      if( pc<iFree
c210: 20 29 7b 20 70 75 74 32 62 79 74 65 28 70 41 64   ){ put2byte(pAd
c220: 64 72 2c 20 70 63 2b 73 7a 29 3b 20 7d 0a 20 20  dr, pc+sz); }.  
c230: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
c240: 20 70 63 3c 69 46 72 65 65 32 20 29 7b 20 70 75   pc<iFree2 ){ pu
c250: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70 63  t2byte(pAddr, pc
c260: 2b 73 7a 32 29 3b 20 7d 0a 20 20 20 20 20 20 20  +sz2); }.       
c270: 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
c280: 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3b 0a  defragment_out;.
c290: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c2a0: 7d 0a 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  }..  cbrk = usab
c2b0: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c  leSize;.  iCellL
c2c0: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
c2d0: 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   - 4;.  for(i=0;
c2e0: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
c2f0: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
c300: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
c310: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
c320: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
c330: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
c340: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
c350: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
c360: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
c370: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
c380: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
c390: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
c3a0: 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74   /* These condit
c3b0: 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64  ions have alread
c3c0: 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20  y been verified 
c3d0: 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  in btreeInitPage
c3e0: 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50 52 41  ().    ** if PRA
c3f0: 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68  GMA cell_size_ch
c400: 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20  eck=ON..    */. 
c410: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
c420: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
c430: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
c440: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c450: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
c460: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
c470: 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73  t( pc>=iCellFirs
c480: 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61  t && pc<=iCellLa
c490: 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  st );.    size =
c4a0: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
c4b0: 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70 63  e(pPage, &src[pc
c4c0: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
c4d0: 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62  size;.    if( cb
c4e0: 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  rk<iCellFirst ||
c4f0: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
c500: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
c510: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c520: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
c530: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
c540: 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61  ( cbrk+size<=usa
c550: 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e  bleSize && cbrk>
c560: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
c570: 20 20 20 74 65 73 74 63 61 73 65 28 20 63 62 72     testcase( cbr
c580: 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69  k+size==usableSi
c590: 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ze );.    testca
c5a0: 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61  se( pc+size==usa
c5b0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70  bleSize );.    p
c5c0: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63  ut2byte(pAddr, c
c5d0: 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65  brk);.    if( te
c5e0: 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  mp==0 ){.      i
c5f0: 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20  nt x;.      if( 
c600: 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69  cbrk==pc ) conti
c610: 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20  nue;.      temp 
c620: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
c630: 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70  mpSpace(pPage->p
c640: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
c650: 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28     x = get2byte(
c660: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
c670: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d       memcpy(&tem
c680: 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20  p[x], &data[x], 
c690: 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29  (cbrk+size) - x)
c6a0: 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74 65  ;.      src = te
c6b0: 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  mp;.    }.    me
c6c0: 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d  mcpy(&data[cbrk]
c6d0: 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65  , &src[pc], size
c6e0: 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
c6f0: 72 2b 37 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72  r+7] = 0;.. defr
c700: 61 67 6d 65 6e 74 5f 6f 75 74 3a 0a 20 20 69 66  agment_out:.  if
c710: 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62  ( data[hdr+7]+cb
c720: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70  rk-iCellFirst!=p
c730: 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
c740: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c750: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
c760: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  age);.  }.  asse
c770: 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46  rt( cbrk>=iCellF
c780: 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79  irst );.  put2by
c790: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
c7a0: 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68   cbrk);.  data[h
c7b0: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
c7c0: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
c7d0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65  memset(&data[iCe
c7e0: 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72  llFirst], 0, cbr
c7f0: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  k-iCellFirst);. 
c800: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c810: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
c820: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c830: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
c840: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c850: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
c860: 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50  -list on page pP
c870: 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73  g for space to s
c880: 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74  tore a cell nByt
c890: 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69  e bytes in.** si
c8a0: 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62  ze. If one can b
c8b0: 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
c8c0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
c8d0: 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76   space and remov
c8e0: 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  e it.** from the
c8f0: 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
c900: 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
c910: 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f   space can be fo
c920: 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  und on the free-
c930: 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c  list, return NUL
c940: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  L..**.** This fu
c950: 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63  nction may detec
c960: 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74  t corruption wit
c970: 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72  hin pPg.  If cor
c980: 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65  ruption is.** de
c990: 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63  tected then *pRc
c9a0: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
c9b0: 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55  E_CORRUPT and NU
c9c0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
c9d0: 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74  **.** Slots on t
c9e0: 68 65 20 66 72 65 65 20 6c 69 73 74 20 74 68 61  he free list tha
c9f0: 74 20 61 72 65 20 62 65 74 77 65 65 6e 20 31 20  t are between 1 
ca00: 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72 67  and 3 bytes larg
ca10: 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a  er than nByte.**
ca20: 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
ca30: 20 69 66 20 61 64 64 69 6e 67 20 74 68 65 20 65   if adding the e
ca40: 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 74 68  xtra space to th
ca50: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
ca60: 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20  count.** causes 
ca70: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
ca80: 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65  n count to excee
ca90: 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  d 60..*/.static 
caa0: 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74  u8 *pageFindSlot
cab0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69  (MemPage *pPg, i
cac0: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
cad0: 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  Rc){.  const int
cae0: 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
caf0: 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f  ffset;.  u8 * co
cb00: 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
cb10: 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41  >aData;.  int iA
cb20: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
cb30: 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79   int pc = get2by
cb40: 74 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  te(&aData[iAddr]
cb50: 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e  );.  int x;.  in
cb60: 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  t usableSize = p
cb70: 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  Pg->pBt->usableS
cb80: 69 7a 65 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  ize;.  int size;
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
cba0: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
cbb0: 73 6c 6f 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  slot */..  asser
cbc0: 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 77 68 69  t( pc>0 );.  whi
cbd0: 6c 65 28 20 70 63 3c 3d 75 73 61 62 6c 65 53 69  le( pc<=usableSi
cbe0: 7a 65 2d 34 20 29 7b 0a 20 20 20 20 2f 2a 20 45  ze-4 ){.    /* E
cbf0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32  VIDENCE-OF: R-22
cc00: 37 31 30 2d 35 33 33 32 38 20 54 68 65 20 74 68  710-53328 The th
cc10: 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20 62  ird and fourth b
cc20: 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20 20 20  ytes of each.   
cc30: 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f   ** freeblock fo
cc40: 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  rm a big-endian 
cc50: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
cc60: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
cc70: 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a   freeblock.    *
cc80: 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c  * in bytes, incl
cc90: 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79 74 65  uding the 4-byte
cca0: 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
ccb0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
ccc0: 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  &aData[pc+2]);. 
ccd0: 20 20 20 69 66 28 20 28 78 20 3d 20 73 69 7a 65     if( (x = size
cce0: 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a   - nByte)>=0 ){.
ccf0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
cd00: 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74 65  x==4 );.      te
cd10: 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a  stcase( x==3 );.
cd20: 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 2b 70        if( size+p
cd30: 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29  c > usableSize )
cd40: 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d  {.        *pRc =
cd50: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
cd60: 50 41 47 45 28 70 50 67 29 3b 0a 20 20 20 20 20  PAGE(pPg);.     
cd70: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
cd80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3c 34     }else if( x<4
cd90: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
cda0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31  VIDENCE-OF: R-11
cdb0: 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20 77  498-58022 In a w
cdc0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65  ell-formed b-tre
cdd0: 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74 61  e page, the tota
cde0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  l.        ** num
cdf0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
ce00: 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f  fragments may no
ce10: 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a  t exceed 60. */.
ce20: 20 20 20 20 20 20 20 20 69 66 28 20 61 44 61 74          if( aDat
ce30: 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72 65  a[hdr+7]>57 ) re
ce40: 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20  turn 0;..       
ce50: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
ce60: 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65  lot from the fre
ce70: 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74  e-list. Update t
ce80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
ce90: 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74       ** fragment
cea0: 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20  ed bytes within 
ceb0: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
cec0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
ced0: 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74  ta[iAddr], &aDat
cee0: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
cef0: 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20     aData[hdr+7] 
cf00: 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20  += (u8)x;.      
cf10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
cf20: 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69  * The slot remai
cf30: 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ns on the free-l
cf40: 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20  ist. Reduce its 
cf50: 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a  size to account.
cf60: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
cf70: 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64  the portion used
cf80: 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   by the new allo
cf90: 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
cfa0: 20 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61     put2byte(&aDa
cfb0: 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20  ta[pc+2], x);.  
cfc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
cfd0: 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20 78  rn &aData[pc + x
cfe0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41 64  ];.    }.    iAd
cff0: 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63 20  dr = pc;.    pc 
d000: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
d010: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[pc]);.    if( 
d020: 70 63 3c 69 41 64 64 72 2b 73 69 7a 65 20 29 20  pc<iAddr+size ) 
d030: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
d040: 20 70 63 20 29 7b 0a 20 20 20 20 2a 70 52 63 20   pc ){.    *pRc 
d050: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
d060: 5f 50 41 47 45 28 70 50 67 29 3b 0a 20 20 7d 0a  _PAGE(pPg);.  }.
d070: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
d080: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
d090: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70  Byte bytes of sp
d0a0: 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ace from within 
d0b0: 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20  the B-Tree page 
d0c0: 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
d0d0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
d0e0: 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64   Write into *pId
d0f0: 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  x the index into
d100: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a   pPage->aData[].
d110: 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
d120: 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65  byte of allocate
d130: 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20  d space. Return 
d140: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b  either SQLITE_OK
d150: 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   or.** an error 
d160: 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51  code (usually SQ
d170: 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a  LITE_CORRUPT)..*
d180: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
d190: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
d1a0: 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69  there is suffici
d1b0: 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b  ent space to mak
d1c0: 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  e the.** allocat
d1d0: 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ion.  This routi
d1e0: 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ne might need to
d1f0: 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f   defragment in o
d200: 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a  rder to bring.**
d210: 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74   all the space t
d220: 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72  ogether, however
d230: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
d240: 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67  will avoid using
d250: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77  .** the first tw
d260: 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65  o bytes past the
d270: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
d280: 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61  ea since presuma
d290: 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f  bly this.** allo
d2a0: 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  cation is being 
d2b0: 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  made in order to
d2c0: 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   insert a new ce
d2d0: 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a  ll, so we will.*
d2e0: 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65  * also end up ne
d2f0: 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c  eding a new cell
d300: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
d310: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
d320: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
d330: 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c  Page, int nByte,
d340: 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63   int *pIdx){.  c
d350: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
d360: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
d370: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
d380: 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72  he of pPage->hdr
d390: 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a  Offset */.  u8 *
d3a0: 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
d3b0: 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
d3c0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
d3d0: 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  of pPage->aData 
d3e0: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
d410: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
d420: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
d430: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d440: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
d450: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
d460: 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  r return code */
d470: 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20  .  int gap;     
d480: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
d490: 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20   of gap between 
d4a0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e  cell pointers an
d4b0: 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  d cell content *
d4c0: 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  /.  .  assert( s
d4d0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
d4e0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
d4f0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
d500: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
d510: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d520: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d530: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
d540: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
d550: 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d  Byte>=0 );  /* M
d560: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
d570: 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72   is 4 */.  asser
d580: 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  t( pPage->nFree>
d590: 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65  =nByte );.  asse
d5a0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
d5b0: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
d5c0: 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e  ert( nByte < (in
d5d0: 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t)(pPage->pBt->u
d5e0: 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a  sableSize-8) );.
d5f0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d600: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20  ->cellOffset == 
d610: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
d620: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61  ge->leaf );.  ga
d630: 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  p = pPage->cellO
d640: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
d650: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
d660: 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a  ( gap<=65536 );.
d670: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
d680: 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20  : R-29356-02391 
d690: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
d6a0: 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79 74  uses a 65536-byt
d6b0: 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a  e page size.  **
d6c0: 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76 65   and the reserve
d6d0: 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20  d space is zero 
d6e0: 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65  (the usual value
d6f0: 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73 70   for reserved sp
d700: 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ace).  ** then t
d710: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
d720: 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70  offset of an emp
d730: 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f  ty page wants to
d740: 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20   be 65536..  ** 
d750: 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e  However, that in
d760: 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72  teger is too lar
d770: 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20  ge to be stored 
d780: 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69  in a 2-byte unsi
d790: 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65  gned.  ** intege
d7a0: 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66  r, so a value of
d7b0: 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69 74   0 is used in it
d7c0: 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f  s place. */.  to
d7d0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
d7e0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73  ta[hdr+5]);.  as
d7f0: 73 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29  sert( top<=(int)
d800: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
d810: 6c 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65  leSize ); /* Pre
d820: 76 65 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e  vent by getAndIn
d830: 69 74 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66  itPage() */.  if
d840: 28 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20  ( gap>top ){.   
d850: 20 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70   if( top==0 && p
d860: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
d870: 65 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a  eSize==65536 ){.
d880: 20 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33        top = 6553
d890: 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
d8a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d8b0: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
d8c0: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
d8d0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
d8e0: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
d8f0: 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20  between gap and 
d900: 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65  top for one more
d910: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20   cell pointer.  
d920: 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f  ** array entry o
d930: 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68  ffset, and if th
d940: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f  e freelist is no
d950: 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65  t empty, then se
d960: 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72  arch the.  ** fr
d970: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
d980: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
d990: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
d9a0: 69 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74  isfy the request
d9b0: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
d9c0: 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b  e( gap+2==top );
d9d0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
d9e0: 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +1==top );.  tes
d9f0: 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20  tcase( gap==top 
da00: 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68  );.  if( (data[h
da10: 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64  dr+2] || data[hd
da20: 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d  r+1]) && gap+2<=
da30: 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  top ){.    u8 *p
da40: 53 70 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64  Space = pageFind
da50: 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74  Slot(pPage, nByt
da60: 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  e, &rc);.    if(
da70: 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20   pSpace ){.     
da80: 20 61 73 73 65 72 74 28 20 70 53 70 61 63 65 3e   assert( pSpace>
da90: 3d 64 61 74 61 20 26 26 20 28 70 53 70 61 63 65  =data && (pSpace
daa0: 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36 20 29   - data)<65536 )
dab0: 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20  ;.      *pIdx = 
dac0: 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64  (int)(pSpace - d
dad0: 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ata);.      retu
dae0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
daf0: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29    }else if( rc )
db00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
db10: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
db20: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 63  /* The request c
db30: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66  ould not be fulf
db40: 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72  illed using a fr
db50: 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68  eelist slot.  Ch
db60: 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20  eck.  ** to see 
db70: 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69  if defragmentati
db80: 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e  on is necessary.
db90: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
dba0: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74  ( gap+2+nByte==t
dbb0: 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b  op );.  if( gap+
dbc0: 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20  2+nByte>top ){. 
dbd0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
dbe0: 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52  ->nCell>0 || COR
dbf0: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72  RUPT_DB );.    r
dc00: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
dc10: 67 65 28 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c  ge(pPage, MIN(4,
dc20: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20   pPage->nFree - 
dc30: 28 32 2b 6e 42 79 74 65 29 29 29 3b 0a 20 20 20  (2+nByte)));.   
dc40: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
dc50: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
dc60: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
dc70: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
dc80: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 32 2b    assert( gap+2+
dc90: 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20  nByte<=top );.  
dca0: 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  }...  /* Allocat
dcb0: 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68  e memory from th
dcc0: 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e  e gap in between
dcd0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
dce0: 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64  r array.  ** and
dcf0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
dd00: 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72  t area.  The btr
dd10: 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c  eeInitPage() cal
dd20: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20  l has already.  
dd30: 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65  ** validated the
dd40: 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65   freelist.  Give
dd50: 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c  n that the freel
dd60: 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68  ist is valid, th
dd70: 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
dd80: 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  ay that the allo
dd90: 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e  cation can exten
dda0: 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  d off the end of
ddb0: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20   the page..  ** 
ddc0: 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
ddd0: 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20  ow verifies the 
dde0: 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63  previous sentenc
ddf0: 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d  e..  */.  top -=
de00: 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79   nByte;.  put2by
de10: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
de20: 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28   top);.  assert(
de30: 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69   top+nByte <= (i
de40: 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
de50: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a  sableSize );.  *
de60: 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65  pIdx = top;.  re
de70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
de80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
de90: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
dea0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
deb0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
dec0: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
ded0: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
dee0: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
def0: 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a  >aData[iStart].*
df00: 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  * and the size o
df10: 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69  f the block is i
df20: 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  Size bytes..**.*
df30: 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62  * Adjacent freeb
df40: 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73  locks are coales
df50: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ced..**.** Note 
df60: 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68  that even though
df70: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c   the freeblock l
df80: 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20  ist was checked 
df90: 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  by btreeInitPage
dfa0: 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74  (),.** that rout
dfb0: 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74  ine will not det
dfc0: 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77  ect overlap betw
dfd0: 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  een cells or fre
dfe0: 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a  eblocks.  Nor.**
dff0: 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20   does it detect 
e000: 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f  cells or freeblo
e010: 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63  cks that encrouc
e020: 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72  h into the reser
e030: 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20  ved bytes.** at 
e040: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
e050: 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69  age.  So do addi
e060: 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  tional corruptio
e070: 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20  n checks inside 
e080: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
e090: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
e0a0: 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79  E_CORRUPT if any
e0b0: 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f   problems are fo
e0c0: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
e0d0: 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  nt freeSpace(Mem
e0e0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36  Page *pPage, u16
e0f0: 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53 69   iStart, u16 iSi
e100: 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b  ze){.  u16 iPtr;
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e130: 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20 74  Address of ptr t
e140: 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  o next freeblock
e150: 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42   */.  u16 iFreeB
e160: 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lk;             
e170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
e180: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
e190: 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a  xt freeblock */.
e1a0: 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20    u8 hdr;       
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
e1d0: 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20  header size.  0 
e1e0: 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e  or 100 */.  u8 n
e1f0: 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20  Frag = 0;       
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e210: 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69    /* Reduction i
e220: 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  n fragmentation 
e230: 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69  */.  u16 iOrigSi
e240: 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20  ze = iSize;     
e250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
e260: 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
e270: 69 53 69 7a 65 20 2a 2f 0a 20 20 75 31 36 20 78  iSize */.  u16 x
e280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
e2b0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
e2c0: 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20  */.  u32 iEnd = 
e2d0: 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20  iStart + iSize; 
e2e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
e2f0: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
e300: 65 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20  e iStart buffer 
e310: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
e320: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
e330: 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61  ->aData;   /* Pa
e340: 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ge content */.. 
e350: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
e360: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
e370: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
e380: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
e390: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
e3a0: 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
e3b0: 5f 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70  _DB || iStart>=p
e3c0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
e3d0: 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  6+pPage->childPt
e3e0: 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  rSize );.  asser
e3f0: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
e400: 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e   iEnd <= pPage->
e410: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
e420: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
e430: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e440: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
e450: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
e460: 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a  iSize>=4 );   /*
e470: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
e480: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
e490: 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 50 61  ert( iStart<=pPa
e4a0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
e4b0: 69 7a 65 2d 34 20 29 3b 0a 0a 20 20 2f 2a 20 54  ize-4 );..  /* T
e4c0: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  he list of freeb
e4d0: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
e4e0: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
e4f0: 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a  .  Find the .  *
e500: 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69  * spot on the li
e510: 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20  st where iStart 
e520: 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
e530: 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  ed..  */.  hdr =
e540: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
e550: 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20  t;.  iPtr = hdr 
e560: 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b  + 1;.  if( data[
e570: 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61  iPtr+1]==0 && da
e580: 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20  ta[iPtr]==0 ){. 
e590: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b     iFreeBlk = 0;
e5a0: 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f    /* Shortcut fo
e5b0: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20  r the case when 
e5c0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
e5d0: 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65  empty */.  }else
e5e0: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46  {.    while( (iF
e5f0: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
e600: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3c  e(&data[iPtr]))<
e610: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
e620: 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74  if( iFreeBlk<iPt
e630: 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69  r+4 ){.        i
e640: 66 28 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29  f( iFreeBlk==0 )
e650: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
e660: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e670: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
e680: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e690: 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b   iPtr = iFreeBlk
e6a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
e6b0: 69 46 72 65 65 42 6c 6b 3e 70 50 61 67 65 2d 3e  iFreeBlk>pPage->
e6c0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
e6d0: 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  4 ){.      retur
e6e0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e6f0: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
e700: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
e710: 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c  iFreeBlk>iPtr ||
e720: 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a   iFreeBlk==0 );.
e730: 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69    .    /* At thi
e740: 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20  s point:.    ** 
e750: 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46     iFreeBlk:   F
e760: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61  irst freeblock a
e770: 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20  fter iStart, or 
e780: 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20  zero if none.   
e790: 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20   **    iPtr:    
e7a0: 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f     The address o
e7b0: 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  f a pointer to i
e7c0: 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20  FreeBlk.    **. 
e7d0: 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
e7e0: 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73  ee if iFreeBlk s
e7f0: 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63  hould be coalesc
e800: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
e810: 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a  of iStart..    *
e820: 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  /.    if( iFreeB
e830: 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46  lk && iEnd+3>=iF
e840: 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  reeBlk ){.      
e850: 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b  nFrag = iFreeBlk
e860: 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69   - iEnd;.      i
e870: 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b  f( iEnd>iFreeBlk
e880: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
e890: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
e8a0: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 45 6e 64  age);.      iEnd
e8b0: 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65   = iFreeBlk + ge
e8c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
e8d0: 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20  eeBlk+2]);.     
e8e0: 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67   if( iEnd > pPag
e8f0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
e900: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ze ){.        re
e910: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e920: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
e930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
e940: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53  Size = iEnd - iS
e950: 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65  tart;.      iFre
e960: 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28  eBlk = get2byte(
e970: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29  &data[iFreeBlk])
e980: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
e990: 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f  * If iPtr is ano
e9a0: 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28  ther freeblock (
e9b0: 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72  that is, if iPtr
e9c0: 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65   is not the free
e9d0: 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  list.    ** poin
e9e0: 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20  ter in the page 
e9f0: 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65  header) then che
ea00: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74  ck to see if iSt
ea10: 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20  art should be.  
ea20: 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f    ** coalesced o
ea30: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69  nto the end of i
ea40: 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  Ptr..    */.    
ea50: 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29  if( iPtr>hdr+1 )
ea60: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72  {.      int iPtr
ea70: 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74  End = iPtr + get
ea80: 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
ea90: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
eaa0: 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72  iPtrEnd+3>=iStar
eab0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
eac0: 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20   iPtrEnd>iStart 
ead0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
eae0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
eaf0: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 72  ge);.        nFr
eb00: 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69  ag += iStart - i
eb10: 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20  PtrEnd;.        
eb20: 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
eb30: 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74  Ptr;.        iSt
eb40: 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20  art = iPtr;.    
eb50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
eb60: 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72  ( nFrag>data[hdr
eb70: 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c  +7] ) return SQL
eb80: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
eb90: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 64 61 74  (pPage);.    dat
eba0: 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61  a[hdr+7] -= nFra
ebb0: 67 3b 0a 20 20 7d 0a 20 20 78 20 3d 20 67 65 74  g;.  }.  x = get
ebc0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
ebd0: 35 5d 29 3b 0a 20 20 69 66 28 20 69 53 74 61 72  5]);.  if( iStar
ebe0: 74 3c 3d 78 20 29 7b 0a 20 20 20 20 2f 2a 20 54  t<=x ){.    /* T
ebf0: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
ec00: 20 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e   is at the begin
ec10: 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c  ning of the cell
ec20: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20   content area,. 
ec30: 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78     ** so just ex
ec40: 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f  tend the cell co
ec50: 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65  ntent area rathe
ec60: 72 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e  r than create an
ec70: 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65  other.    ** fre
ec80: 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20  elist entry */. 
ec90: 20 20 20 69 66 28 20 69 53 74 61 72 74 3c 78 20     if( iStart<x 
eca0: 7c 7c 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29  || iPtr!=hdr+1 )
ecb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
ecc0: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
ecd0: 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  e);.    put2byte
ece0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69  (&data[hdr+1], i
ecf0: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
ed00: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
ed10: 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65  +5], iEnd);.  }e
ed20: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65  lse{.    /* Inse
ed30: 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62  rt the new freeb
ed40: 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72  lock into the fr
ed50: 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75  eelist */.    pu
ed60: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
ed70: 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 7d  r], iStart);.  }
ed80: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
ed90: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
eda0: 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b  S_FAST_SECURE ){
edb0: 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  .    /* Overwrit
edc0: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
edd0: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
ede0: 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65   when the secure
edf0: 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f  _delete.    ** o
ee00: 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
ee10: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
ee20: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  data[iStart], 0,
ee30: 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70   iSize);.  }.  p
ee40: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53  ut2byte(&data[iS
ee50: 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29  tart], iFreeBlk)
ee60: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
ee70: 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53  ta[iStart+2], iS
ee80: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
ee90: 46 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a  Free += iOrigSiz
eea0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
eeb0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
eec0: 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73  Decode the flags
eed0: 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74   byte (the first
eee0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
eef0: 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a  der) for a page.
ef00: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
ef10: 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
ef20: 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
ef30: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
ef40: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f  *.** Only the fo
ef50: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
ef60: 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74  ions are support
ef70: 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69  ed.  Anything di
ef80: 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63  fferent.** indic
ef90: 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64  ates a corrupt d
efa0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a  atabase files:.*
efb0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  *.**         PTF
efc0: 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20  _ZERODATA.**    
efd0: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
efe0: 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20  A | PTF_LEAF.** 
eff0: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
f000: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
f010: 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  Y.**         PTF
f020: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
f030: 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41  INTKEY | PTF_LEA
f040: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
f050: 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50  decodeFlags(MemP
f060: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
f070: 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53  flagByte){.  BtS
f080: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
f090: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61  /* A copy of pPa
f0a0: 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73  ge->pBt */..  as
f0b0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72  sert( pPage->hdr
f0c0: 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e  Offset==(pPage->
f0d0: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
f0e0: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
f0f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f100: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
f110: 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
f120: 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c  ->leaf = (u8)(fl
f130: 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73  agByte>>3);  ass
f140: 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d  ert( PTF_LEAF ==
f150: 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42   1<<3 );.  flagB
f160: 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46  yte &= ~PTF_LEAF
f170: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ;.  pPage->child
f180: 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50  PtrSize = 4-4*pP
f190: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61  age->leaf;.  pPa
f1a0: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20  ge->xCellSize = 
f1b0: 63 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70  cellSizePtr;.  p
f1c0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
f1d0: 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  .  if( flagByte=
f1e0: 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c  =(PTF_LEAFDATA |
f1f0: 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a   PTF_INTKEY) ){.
f200: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
f210: 4f 46 3a 20 52 2d 30 37 32 39 31 2d 33 35 33 32  OF: R-07291-3532
f220: 38 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 28  8 A value of 5 (
f230: 30 78 30 35 29 20 6d 65 61 6e 73 20 74 68 65 20  0x05) means the 
f240: 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a  page is an.    *
f250: 2a 20 69 6e 74 65 72 69 6f 72 20 74 61 62 6c 65  * interior table
f260: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
f270: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
f280: 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49  F_LEAFDATA|PTF_I
f290: 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20  NTKEY)==5 );.   
f2a0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f2b0: 20 52 2d 32 36 39 30 30 2d 30 39 31 37 36 20 41   R-26900-09176 A
f2c0: 20 76 61 6c 75 65 20 6f 66 20 31 33 20 28 30 78   value of 13 (0x
f2d0: 30 64 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  0d) means the pa
f2e0: 67 65 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c  ge is a.    ** l
f2f0: 65 61 66 20 74 61 62 6c 65 20 62 2d 74 72 65 65  eaf table b-tree
f300: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
f310: 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44  sert( (PTF_LEAFD
f320: 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ATA|PTF_INTKEY|P
f330: 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a  TF_LEAF)==13 );.
f340: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
f350: 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  y = 1;.    if( p
f360: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
f370: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
f380: 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20  yLeaf = 1;.     
f390: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
f3a0: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
f3b0: 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73  ellPtr;.    }els
f3c0: 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  e{.      pPage->
f3d0: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
f3e0: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65        pPage->xCe
f3f0: 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
f400: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  ePtrNoPayload;. 
f410: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
f420: 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61  seCell = btreePa
f430: 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c  rseCellPtrNoPayl
f440: 6f 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  oad;.    }.    p
f450: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
f460: 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20   pBt->maxLeaf;. 
f470: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
f480: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  al = pBt->minLea
f490: 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  f;.  }else if( f
f4a0: 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52  lagByte==PTF_ZER
f4b0: 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20  ODATA ){.    /* 
f4c0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
f4d0: 33 33 31 36 2d 33 37 33 30 38 20 41 20 76 61 6c  3316-37308 A val
f4e0: 75 65 20 6f 66 20 32 20 28 30 78 30 32 29 20 6d  ue of 2 (0x02) m
f4f0: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
f500: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72   an.    ** inter
f510: 69 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65  ior index b-tree
f520: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
f530: 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
f540: 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f  ATA)==2 );.    /
f550: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
f560: 2d 35 39 36 31 35 2d 34 32 38 32 38 20 41 20 76  -59615-42828 A v
f570: 61 6c 75 65 20 6f 66 20 31 30 20 28 30 78 30 61  alue of 10 (0x0a
f580: 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  ) means the page
f590: 20 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61   is a.    ** lea
f5a0: 66 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  f index b-tree p
f5b0: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
f5c0: 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
f5d0: 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20  A|PTF_LEAF)==10 
f5e0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
f5f0: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
f600: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
f610: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
f620: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
f630: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
f640: 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  dex;.    pPage->
f650: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
f660: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
f670: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
f680: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
f690: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45   }else{.    /* E
f6a0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37  VIDENCE-OF: R-47
f6b0: 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f 74  608-56469 Any ot
f6c0: 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68  her value for th
f6d0: 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
f6e0: 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20  pe is.    ** an 
f6f0: 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65  error. */.    re
f700: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
f710: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
f720: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61  .  }.  pPage->ma
f730: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
f740: 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
f750: 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  load;.  return S
f760: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f770: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
f780: 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  e auxiliary info
f790: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69  rmation for a di
f7a0: 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  sk block..**.** 
f7b0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
f7c0: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
f7d0: 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65   we see that the
f7e0: 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   page does.** no
f7f0: 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c  t contain a well
f800: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
f810: 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75   page, then retu
f820: 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f  rn .** SQLITE_CO
f830: 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61  RRUPT.  Note tha
f840: 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51  t a return of SQ
f850: 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74  LITE_OK does not
f860: 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68  .** guarantee th
f870: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77  at the page is w
f880: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20  ell-formed.  It 
f890: 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a  only shows that.
f8a0: 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20  ** we failed to 
f8b0: 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75  detect any corru
f8c0: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
f8d0: 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61   int btreeInitPa
f8e0: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
f8f0: 65 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20  e){.  int pc;   
f900: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
f910: 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
f920: 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
f930: 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  >aData[] */.  u8
f940: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
f950: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
f960: 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
f970: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a  header */.  u8 *
f980: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
f990: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
f9a0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53  ->aData */.  BtS
f9b0: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
f9c0: 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62     /* The main b
f9d0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
f9e0: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
f9f0: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
fa00: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
fa10: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
fa20: 0a 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65  .  u16 cellOffse
fa30: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
fa40: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
fa50: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
fa60: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
fa70: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
fa80: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
fa90: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
faa0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
fab0: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
fac0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
fad0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
fae0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69   area */.  int i
faf0: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a  CellFirst;    /*
fb00: 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65   First allowable
fb10: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
fb20: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69  ck offset */.  i
fb30: 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
fb40: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
fb50: 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62  le cell or freeb
fb60: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a  lock offset */..
fb70: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
fb80: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
fb90: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
fba0: 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  >db!=0 );.  asse
fbb0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
fbc0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
fbd0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
fbe0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
fbf0: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
fc00: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
fc10: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
fc20: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
fc30: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
fc40: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
fc50: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
fc60: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
fc70: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
fc80: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
fc90: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
fca0: 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
fcb0: 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d  t==0 );..  pBt =
fcc0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 68   pPage->pBt;.  h
fcd0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
fce0: 66 66 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20  ffset;.  data = 
fcf0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
fd00: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
fd10: 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68  R-28594-02890 Th
fd20: 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20  e one-byte flag 
fd30: 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69  at offset 0 indi
fd40: 63 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  cating.  ** the 
fd50: 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
fd60: 2e 20 2a 2f 0a 20 20 69 66 28 20 64 65 63 6f 64  . */.  if( decod
fd70: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61  eFlags(pPage, da
fd80: 74 61 5b 68 64 72 5d 29 20 29 7b 0a 20 20 20 20  ta[hdr]) ){.    
fd90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
fda0: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
fdb0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
fdc0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
fdd0: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
fde0: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
fdf0: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
fe00: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
fe10: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
fe20: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
fe30: 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  = 0;.  usableSiz
fe40: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
fe50: 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  ize;.  pPage->ce
fe60: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
fe70: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20  ffset = hdr + 8 
fe80: 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
fe90: 72 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e  rSize;.  pPage->
fea0: 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61  aDataEnd = &data
feb0: 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  [usableSize];.  
fec0: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
fed0: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
fee0: 65 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  et];.  pPage->aD
fef0: 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b  ataOfst = &data[
ff00: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
ff10: 69 7a 65 5d 3b 0a 20 20 2f 2a 20 45 56 49 44 45  ize];.  /* EVIDE
ff20: 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d  NCE-OF: R-58015-
ff30: 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79  48175 The two-by
ff40: 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
ff50: 66 73 65 74 20 35 20 64 65 73 69 67 6e 61 74 65  fset 5 designate
ff60: 73 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74  s.  ** the start
ff70: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
ff80: 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72  tent area. A zer
ff90: 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  o value for this
ffa0: 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20 2a 2a   integer is.  **
ffb0: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
ffc0: 36 35 35 33 36 2e 20 2a 2f 0a 20 20 74 6f 70 20  65536. */.  top 
ffd0: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
ffe0: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
fff0: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
10000 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34  F: R-37002-32774
10010 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
10020 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
10030 33 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a  3 gives the.  **
10040 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
10050 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f   on the page. */
10060 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
10070 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
10080 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20  [hdr+3]);.  if( 
10090 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
100a0 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
100b0 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
100c0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
100d0 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
100e0 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
100f0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
10100 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
10110 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 74  (pPage);.  }.  t
10120 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
10130 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70  nCell==MX_CELL(p
10140 42 74 29 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44  Bt) );.  /* EVID
10150 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39  ENCE-OF: R-24089
10160 2d 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65  -57979 If a page
10170 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
10180 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c  ls (which is onl
10190 79 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20  y.  ** possible 
101a0 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20  for a root page 
101b0 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  of a table that 
101c0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73  contains no rows
101d0 29 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  ) then the.  ** 
101e0 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  offset to the ce
101f0 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
10200 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70  will equal the p
10210 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74  age size minus t
10220 68 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  he.  ** bytes of
10230 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 2e   reserved space.
10240 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
10250 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
10260 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  top==usableSize 
10270 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
10280 0a 0a 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d  ..  /* A malform
10290 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
102a0 20 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20   might cause us 
102b0 74 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65  to read past the
102c0 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 70 61 67   end.  ** of pag
102d0 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61  e when parsing a
102e0 20 63 65 6c 6c 2e 20 20 0a 20 20 2a 2a 0a 20 20   cell.  .  **.  
102f0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
10300 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
10310 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
10320 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
10330 65 6e 64 73 0a 20 20 2a 2a 20 70 61 73 74 20 74  ends.  ** past t
10340 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65  he end of a page
10350 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61   boundary and ca
10360 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  uses SQLITE_CORR
10370 55 50 54 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20  UPT to be .  ** 
10380 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
10390 6f 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 43 65 6c  oes..  */.  iCel
103a0 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
103b0 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
103c0 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Cell;.  iCellLas
103d0 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
103e0 20 34 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 64   4;.  if( pBt->d
103f0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
10400 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a  E_CellSizeCk ){.
10410 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
10420 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
10430 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  nto the cell poi
10440 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
10450 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20    int sz;       
10460 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
10470 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 69 66   cell */..    if
10480 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
10490 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20   iCellLast--;.  
104a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
104b0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
104c0 0a 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32  .      pc = get2
104d0 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74  byteAligned(&dat
104e0 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32  a[cellOffset+i*2
104f0 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ]);.      testca
10500 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
10510 73 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  st );.      test
10520 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
10530 61 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ast );.      if(
10540 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
10550 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
10560 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
10570 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10580 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
10590 20 20 20 7d 0a 20 20 20 20 20 20 73 7a 20 3d 20     }.      sz = 
105a0 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
105b0 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
105c0 5d 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ]);.      testca
105d0 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c  se( pc+sz==usabl
105e0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  eSize );.      i
105f0 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53  f( pc+sz>usableS
10600 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
10610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10620 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
10630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10640 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
10650 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
10660 2b 2b 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20  ++;.  }  ..  /* 
10670 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
10680 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
10690 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20 45 56  the page.  ** EV
106a0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35  IDENCE-OF: R-235
106b0 38 38 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f  88-34450 The two
106c0 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
106d0 20 6f 66 66 73 65 74 20 31 20 67 69 76 65 73 20   offset 1 gives 
106e0 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f  the.  ** start o
106f0 66 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  f the first free
10700 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67  block on the pag
10710 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69 66  e, or is zero if
10720 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
10730 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a  ** freeblocks. *
10740 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  /.  pc = get2byt
10750 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
10760 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b  .  nFree = data[
10770 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f  hdr+7] + top;  /
10780 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20  * Init nFree to 
10790 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72  non-freeblock fr
107a0 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 69 66  ee space */.  if
107b0 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 75 33  ( pc>0 ){.    u3
107c0 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  2 next, size;.  
107d0 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
107e0 72 73 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  rst ){.      /* 
107f0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
10800 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20  5530-52930 In a 
10810 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72  well-formed b-tr
10820 65 65 20 70 61 67 65 2c 20 74 68 65 72 65 20 77  ee page, there w
10830 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 77  ill.      ** alw
10840 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
10850 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
10860 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
10870 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ock..      */.  
10880 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10890 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
108a0 50 61 67 65 29 3b 20 0a 20 20 20 20 7d 0a 20 20  Page); .    }.  
108b0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
108c0 20 20 20 20 69 66 28 20 70 63 3e 69 43 65 6c 6c      if( pc>iCell
108d0 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
108e0 2f 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66  /* Freeblock off
108f0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
10900 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
10910 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10920 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
10930 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10940 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
10950 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
10960 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
10970 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
10980 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e  .      nFree = n
10990 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20  Free + size;.   
109a0 20 20 20 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b     if( next<=pc+
109b0 73 69 7a 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a  size+3 ) break;.
109c0 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
109d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
109e0 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  ext>0 ){.      /
109f0 2a 20 46 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20  * Freeblock not 
10a00 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
10a10 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  er */.      retu
10a20 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10a30 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
10a40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 63 2b     }.    if( pc+
10a50 73 69 7a 65 3e 28 75 6e 73 69 67 6e 65 64 20 69  size>(unsigned i
10a60 6e 74 29 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  nt)usableSize ){
10a70 0a 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 66  .      /* Last f
10a80 72 65 65 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73  reeblock extends
10a90 20 70 61 73 74 20 70 61 67 65 20 65 6e 64 20 2a   past page end *
10aa0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
10ab0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
10ac0 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
10ad0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68  .  }..  /* At th
10ae0 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20  is point, nFree 
10af0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d  contains the sum
10b00 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74   of the offset t
10b10 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
10b20 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
10b30 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
10b40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
10b50 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
10b60 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
10b70 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
10b80 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
10b90 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
10ba0 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  ze.  ** of the p
10bb0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61  age, then the pa
10bc0 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
10bd0 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b  pted. This check
10be0 20 61 6c 73 6f 0a 20 20 2a 2a 20 73 65 72 76 65   also.  ** serve
10bf0 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
10c00 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
10c10 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
10c20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a  cell-content.  *
10c30 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
10c40 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
10c50 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
10c60 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2f  n the page..  */
10c70 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61  .  if( nFree>usa
10c80 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  bleSize ){.    r
10c90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10ca0 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
10cb0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
10cc0 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72  Free = (u16)(nFr
10cd0 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29  ee - iCellFirst)
10ce0 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
10cf0 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  t = 1;.  return 
10d00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10d10 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
10d20 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
10d30 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
10d40 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
10d50 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
10d60 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
10d70 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
10d80 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
10d90 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
10da0 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
10db0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
10dc0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10dd0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
10de0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
10df0 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
10e00 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
10e10 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
10e20 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
10e30 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
10e40 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
10e50 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
10e60 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
10e70 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
10e80 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
10e90 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
10ea0 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
10eb0 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
10ec0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
10ed0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
10ee0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
10ef0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
10f00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10f10 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
10f20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  );.  if( pBt->bt
10f30 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53  sFlags & BTS_FAS
10f40 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20  T_SECURE ){.    
10f50 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
10f60 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ], 0, pBt->usabl
10f70 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20  eSize - hdr);.  
10f80 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  }.  data[hdr] = 
10f90 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66  (char)flags;.  f
10fa0 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28 66  irst = hdr + ((f
10fb0 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
10fc0 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d  0 ? 12 : 8);.  m
10fd0 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
10fe0 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
10ff0 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
11000 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
11010 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
11020 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
11030 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
11040 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
11050 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
11060 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
11070 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
11080 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
11090 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  st;.  pPage->aDa
110a0 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42  taEnd = &data[pB
110b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  t->usableSize];.
110c0 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
110d0 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d  x = &data[first]
110e0 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
110f0 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
11100 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
11110 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ];.  pPage->nOve
11120 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73  rflow = 0;.  ass
11130 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
11140 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
11150 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
11160 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  );.  pPage->mask
11170 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74  Page = (u16)(pBt
11180 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  ->pageSize - 1);
11190 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
111a0 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  = 0;.  pPage->is
111b0 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  Init = 1;.}.../*
111c0 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62  .** Convert a Db
111d0 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72  Page obtained fr
111e0 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74  om the pager int
111f0 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64  o a MemPage used
11200 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65   by.** the btree
11210 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   layer..*/.stati
11220 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
11230 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44  PageFromDbPage(D
11240 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  bPage *pDbPage, 
11250 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61  Pgno pgno, BtSha
11260 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
11270 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d  Page *pPage = (M
11280 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
11290 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
112a0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67 6e  Page);.  if( pgn
112b0 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  o!=pPage->pgno )
112c0 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61  {.    pPage->aDa
112d0 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
112e0 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
112f0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 44  );.    pPage->pD
11300 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
11310 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20  .    pPage->pBt 
11320 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67 65  = pBt;.    pPage
11330 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
11340 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66     pPage->hdrOff
11350 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20  set = pgno==1 ? 
11360 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61  100 : 0;.  }.  a
11370 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
11380 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  ata==sqlite3Page
11390 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
113a0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ) );.  return pP
113b0 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
113c0 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
113d0 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
113e0 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
113f0 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
11400 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
11410 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20 20  nts if needed.  
11420 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65 47  See also: btreeG
11430 65 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e 0a  etUnusedPage()..
11440 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41 47  **.** If the PAG
11450 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
11460 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
11470 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
11480 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62  o not care.** ab
11490 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  out the content 
114a0 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
114b0 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
114c0 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
114d0 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
114e0 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
114f0 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
11500 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
11510 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
11520 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
11530 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
11540 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
11550 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
11560 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
11570 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
11580 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
11590 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
115a0 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
115b0 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
115c0 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
115d0 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65  int btreeGetPage
115e0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
115f0 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
11600 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
11610 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
11620 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
11630 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
11640 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
11650 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
11660 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
11670 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
11680 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
11690 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
116a0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
116b0 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
116c0 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
116d0 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
116e0 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
116f0 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
11700 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
11710 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61  NOCONTENT || fla
11720 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45  gs==PAGER_GET_RE
11730 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65  ADONLY );.  asse
11740 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11750 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
11760 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
11770 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
11780 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
11790 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
117a0 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ge, flags);.  if
117b0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
117c0 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  ;.  *ppPage = bt
117d0 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
117e0 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
117f0 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   pBt);.  return 
11800 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
11810 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70  .** Retrieve a p
11820 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
11830 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
11840 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
11850 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  is not.** alread
11860 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  y in the pager c
11870 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ache return NULL
11880 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  . Initialize the
11890 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
118a0 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
118b0 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
118c0 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
118d0 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
118e0 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65  geLookup(BtShare
118f0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
11900 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
11910 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
11920 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11930 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
11940 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
11950 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
11960 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
11970 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
11980 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
11990 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  n btreePageFromD
119a0 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
119b0 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20  gno, pBt);.  }. 
119c0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
119d0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
119e0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
119f0 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
11a00 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
11a10 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72  ny kind of.** er
11a20 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e  ror, return ((un
11a30 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a  signed int)-1)..
11a40 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62  */.static Pgno b
11a50 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74  treePagecount(Bt
11a60 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
11a70 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67  return pBt->nPag
11a80 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33  e;.}.u32 sqlite3
11a90 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74  BtreeLastPage(Bt
11aa0 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
11ab0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
11ac0 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
11ad0 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70    assert( ((p->p
11ae0 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30  Bt->nPage)&0x800
11af0 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72  00000)==0 );.  r
11b00 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 63  eturn btreePagec
11b10 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a  ount(p->pBt);.}.
11b20 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
11b30 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
11b40 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
11b50 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75  it..**.** If pCu
11b60 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61  r!=0 then the pa
11b70 67 65 20 69 73 20 62 65 69 6e 67 20 66 65 74 63  ge is being fetc
11b80 68 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  hed as part of a
11b90 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a   moveToChild().*
11ba0 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69  * call.  Do addi
11bb0 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68  tional sanity ch
11bc0 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
11bd0 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
11be0 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66  .** And if the f
11bf0 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73  etch fails, this
11c00 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65   routine must de
11c10 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50  crement pCur->iP
11c20 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
11c30 61 67 65 20 69 73 20 66 65 74 63 68 65 64 20 61  age is fetched a
11c40 73 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c  s read-write unl
11c50 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20  ess pCur is not 
11c60 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61  NULL and is.** a
11c70 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
11c80 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  r..**.** If an e
11c90 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
11ca0 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64  n *ppPage is und
11cb0 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61  efined. It.** ma
11cc0 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67  y remain unchang
11cd0 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65  ed, or it may be
11ce0 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c   set to an inval
11cf0 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  id value..*/.sta
11d00 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
11d10 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
11d20 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
11d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11d40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
11d50 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
11d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11d80 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74   the page to get
11d90 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
11da0 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
11db0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
11dc0 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
11dd0 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  here */.  BtCurs
11de0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
11df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
11e00 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20 74  sor to receive t
11e10 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c  he page, or NULL
11e20 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f   */.  int bReadO
11e30 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20 20 20  nly             
11e40 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
11e50 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61  r a read-only pa
11e60 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ge */.){.  int r
11e70 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
11e80 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
11e90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11ea0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
11eb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
11ec0 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26  ==0 || ppPage==&
11ed0 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20  pCur->pPage );. 
11ee0 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30   assert( pCur==0
11ef0 20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70   || bReadOnly==p
11f00 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
11f10 67 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  gs );.  assert( 
11f20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  pCur==0 || pCur-
11f30 3e 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69  >iPage>0 );..  i
11f40 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67  f( pgno>btreePag
11f50 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
11f60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
11f70 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
11f80 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
11f90 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  Page_error;.  }.
11fa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
11fb0 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
11fc0 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
11fd0 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52  e**)&pDbPage, bR
11fe0 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20  eadOnly);.  if( 
11ff0 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67  rc ){.    goto g
12000 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
12010 72 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61  ror;.  }.  *ppPa
12020 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
12030 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
12040 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
12050 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69  if( (*ppPage)->i
12060 73 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  sInit==0 ){.    
12070 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
12080 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
12090 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20  o, pBt);.    rc 
120a0 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
120b0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  *ppPage);.    if
120c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
120d0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
120e0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
120f0 20 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64       goto getAnd
12100 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a  InitPage_error;.
12110 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
12120 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70  rt( (*ppPage)->p
12130 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61  gno==pgno );.  a
12140 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
12150 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33  ->aData==sqlite3
12160 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
12170 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  Page) );..  /* I
12180 66 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 63 68  f obtaining a ch
12190 69 6c 64 20 70 61 67 65 20 66 6f 72 20 61 20 63  ild page for a c
121a0 75 72 73 6f 72 2c 20 77 65 20 6d 75 73 74 20 76  ursor, we must v
121b0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 70  erify that the p
121c0 61 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70  age is.  ** comp
121d0 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20  atible with the 
121e0 72 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  root page. */.  
121f0 69 66 28 20 70 43 75 72 20 26 26 20 28 28 2a 70  if( pCur && ((*p
12200 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20  pPage)->nCell<1 
12210 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e  || (*ppPage)->in
12220 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49  tKey!=pCur->curI
12230 6e 74 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 63  ntKey) ){.    rc
12240 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
12250 54 5f 50 47 4e 4f 28 70 67 6e 6f 29 3b 0a 20 20  T_PGNO(pgno);.  
12260 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
12270 70 50 61 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f  pPage);.    goto
12280 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
12290 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74  error;.  }.  ret
122a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
122b0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
122c0 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 43 75 72  rror:.  if( pCur
122d0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50   ){.    pCur->iP
122e0 61 67 65 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d  age--;.    pCur-
122f0 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  >pPage = pCur->a
12300 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
12310 65 5d 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61  e];.  }.  testca
12320 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20  se( pgno==0 );. 
12330 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
12340 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43   || rc==SQLITE_C
12350 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75  ORRUPT );.  retu
12360 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12370 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67  Release a MemPag
12380 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  e.  This should 
12390 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
123a0 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a  or each prior.**
123b0 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65   call to btreeGe
123c0 74 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  tPage..**.** Pag
123d0 65 31 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  e1 is a special 
123e0 63 61 73 65 20 61 6e 64 20 6d 75 73 74 20 62 65  case and must be
123f0 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
12400 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 29  releasePageOne()
12410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12420 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
12430 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ull(MemPage *pPa
12440 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
12450 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
12460 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
12470 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
12480 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21   pPage->pDbPage!
12490 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
124a0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
124b0 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
124c0 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
124d0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
124e0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
124f0 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
12500 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
12510 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
12520 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12530 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
12540 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
12550 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
12560 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62 50  Null(pPage->pDbP
12570 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  age);.}.static v
12580 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
12590 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
125a0 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 20 72  .  if( pPage ) r
125b0 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
125c0 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74  l(pPage);.}.stat
125d0 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
125e0 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67 65 20 2a  ageOne(MemPage *
125f0 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  pPage){.  assert
12600 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  ( pPage!=0 );.  
12610 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
12620 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
12630 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
12640 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
12650 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20  >pDbPage!=0 );. 
12660 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12670 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
12680 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
12690 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
126a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
126b0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
126c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
126d0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
126e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
126f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
12700 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
12710 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
12720 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28 70 50  rUnrefPageOne(pP
12730 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d  age->pDbPage);.}
12740 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75  ../*.** Get an u
12750 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nused page..**.*
12760 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73  * This works jus
12770 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65 74 50  t like btreeGetP
12780 61 67 65 28 29 20 77 69 74 68 20 74 68 65 20 61  age() with the a
12790 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20  ddition:.**.**  
127a0 20 2a 20 20 49 66 20 74 68 65 20 70 61 67 65 20   *  If the page 
127b0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73  is already in us
127c0 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
127d0 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69   purpose, immedi
127e0 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65  ately.**      re
127f0 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72 65 74  lease it and ret
12800 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 55  urn an SQLITE_CU
12810 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20  RRUPT error..** 
12820 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65 20 74    *  Make sure t
12830 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67 20 69  he isInit flag i
12840 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69  s clear.*/.stati
12850 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 55 6e  c int btreeGetUn
12860 75 73 65 64 50 61 67 65 28 0a 20 20 42 74 53 68  usedPage(.  BtSh
12870 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
12880 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
12890 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
128a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
128b0 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
128c0 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
128d0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
128e0 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
128f0 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
12900 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
12910 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
12920 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
12930 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
12940 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
12950 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 62 74  ){.  int rc = bt
12960 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
12970 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
12980 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ags);.  if( rc==
12990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
129a0 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
129b0 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
129c0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
129d0 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  )>1 ){.      rel
129e0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
129f0 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  );.      *ppPage
12a00 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
12a10 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12a20 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
12a30 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49    (*ppPage)->isI
12a40 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nit = 0;.  }else
12a50 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
12a60 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
12a70 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75  rc;.}.../*.** Du
12a80 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
12a90 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
12aa0 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74  reloads informat
12ab0 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63  ion into the cac
12ac0 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  he.** so that th
12ad0 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  e cache is resto
12ae0 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
12af0 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65  nal state at the
12b00 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
12b10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f   transaction, fo
12b20 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74  r each page rest
12b30 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  ored this routin
12b40 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
12b50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12b60 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74  needs to reset t
12b70 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65  he extra data se
12b80 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64  ction at the end
12b90 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
12ba0 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
12bb0 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e  e restored data.
12bc0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12bd0 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67  pageReinit(DbPag
12be0 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d  e *pData){.  Mem
12bf0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70  Page *pPage;.  p
12c00 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
12c10 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
12c20 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
12c30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12c40 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
12c50 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20  t(pData)>0 );.  
12c60 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
12c70 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
12c80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12c90 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
12ca0 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
12cb0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
12cc0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12cd0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
12ce0 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20  t(pData)>1 ){.  
12cf0 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67      /* pPage mig
12d00 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65  ht not be a btre
12d10 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68  e page;  it migh
12d20 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  t be an overflow
12d30 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f   page.      ** o
12d40 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72  r ptrmap page or
12d50 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49   a free page.  I
12d60 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74  n those cases, t
12d70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
12d80 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74     ** call to bt
12d90 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69  reeInitPage() wi
12da0 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e  ll likely return
12db0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
12dc0 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f  .      ** But no
12dd0 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79   harm is done by
12de0 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69   this.  And it i
12df0 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74  s very important
12e00 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62   that.      ** b
12e10 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62  treeInitPage() b
12e20 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72  e called on ever
12e30 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20  y btree page so 
12e40 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a  we make.      **
12e50 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76   the call for ev
12e60 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f  ery page that co
12e70 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e  mes in for re-in
12e80 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  iting. */.      
12e90 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
12ea0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
12eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
12ec0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
12ed0 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
12ee0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
12ef0 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
12f00 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  er(void *pArg){.
12f10 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
12f20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
12f30 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
12f40 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
12f50 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12f60 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
12f70 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
12f80 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
12f90 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
12fa0 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2c  db->busyHandler,
12fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fd0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 46     sqlite3PagerF
12fe0 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ile(pBt->pPager)
12ff0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
13000 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
13010 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
13020 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
13030 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
13040 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
13050 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  me is NULL.** th
13060 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
13070 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
13080 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65  ted.  The epheme
13090 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67  ral database mig
130a0 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69  ht.** be exclusi
130b0 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  vely in memory, 
130c0 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20  or it might use 
130d0 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d  a disk-based mem
130e0 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69  ory cache..** Ei
130f0 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70  ther way, the ep
13100 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
13110 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
13120 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a  ically deleted .
13130 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ** when sqlite3B
13140 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
13150 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
13160 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
13170 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
13180 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
13190 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
131a0 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
131b0 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
131c0 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
131d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66  ed..**.** The "f
131e0 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20  lags" parameter 
131f0 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
13200 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  t might contain 
13210 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52  bits like.** BTR
13220 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  EE_OMIT_JOURNAL 
13230 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d  and/or BTREE_MEM
13240 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ORY..**.** If th
13250 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
13260 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
13270 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
13280 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
13290 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
132a0 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
132b0 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
132c0 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
132d0 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
132e0 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
132f0 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
13300 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
13310 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
13320 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
13330 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
13340 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
13350 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
13360 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
13370 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
13380 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73  e3BtreeOpen(.  s
13390 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
133a0 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f  ,      /* VFS to
133b0 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d   use for this b-
133c0 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tree */.  const 
133d0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
133e0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
133f0 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
13400 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
13410 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
13420 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
13430 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
13440 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
13450 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
13460 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
13470 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
13480 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
13490 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
134a0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
134b0 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
134c0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
134d0 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
134e0 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
134f0 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
13500 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
13510 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
13520 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
13530 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
13540 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
13550 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
13560 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
13570 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
13580 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
13590 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
135a0 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
135b0 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
135c0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
135d0 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
135e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
135f0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
13600 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
13610 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
13620 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
13630 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
13640 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
13650 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
13660 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
13670 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
13680 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
13690 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
136a0 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
136b0 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69  /* True if openi
136c0 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c  ng an ephemeral,
136d0 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
136e0 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ase */.  const i
136f0 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46  nt isTempDb = zF
13700 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
13710 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a  ilename[0]==0;..
13720 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
13730 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
13740 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
13750 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
13760 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
13770 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
13780 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
13790 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
137a0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f  IT_MEMORYDB.  co
137b0 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
137c0 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  = 0;.#else.  con
137d0 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
137e0 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73   (zFilename && s
137f0 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
13800 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29   ":memory:")==0)
13810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13820 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65          || (isTe
13830 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54  mpDb && sqlite3T
13840 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29  empInMemory(db))
13850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13860 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46          || (vfsF
13870 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
13880 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23  EN_MEMORY)!=0;.#
13890 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
138a0 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
138b0 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20  rt( pVfs!=0 );. 
138c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
138d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
138e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
138f0 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29  rt( (flags&0xff)
13900 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20  ==flags );   /* 
13910 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62  flags fit in 8 b
13920 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c  its */..  /* Onl
13930 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  y a BTREE_SINGLE
13940 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
13950 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
13960 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
13970 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f  lags & BTREE_UNO
13980 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66  RDERED)==0 || (f
13990 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
139a0 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  GLE)!=0 );..  /*
139b0 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   A BTREE_SINGLE 
139c0 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61  database is alwa
139d0 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61  ys a temporary a
139e0 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20  nd/or ephemeral 
139f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
13a00 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
13a10 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  LE)==0 || isTemp
13a20 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d  Db );..  if( isM
13a30 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
13a40 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
13a50 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
13a60 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
13a70 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
13a80 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
13a90 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
13aa0 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
13ab0 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
13ac0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
13ad0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
13ae0 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
13af0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
13b00 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
13b10 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
13b20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
13b30 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
13b40 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
13b50 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
13b60 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20  b = db;.#ifndef 
13b70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
13b80 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f  ED_CACHE.  p->lo
13b90 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  ck.pBtree = p;. 
13ba0 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20   p->lock.iTable 
13bb0 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 1;.#endif..#if
13bc0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13bd0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
13be0 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
13bf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
13c00 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  IO).  /*.  ** If
13c10 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61   this Btree is a
13c20 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73   candidate for s
13c30 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79  hared cache, try
13c40 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a   to find an.  **
13c50 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72   existing BtShar
13c60 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  ed object that w
13c70 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68  e can share with
13c80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65  .  */.  if( isTe
13c90 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65  mpDb==0 && (isMe
13ca0 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c  mdb==0 || (vfsFl
13cb0 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
13cc0 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  URI)!=0) ){.    
13cd0 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53  if( vfsFlags & S
13ce0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
13cf0 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20  DCACHE ){.      
13d00 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20  int nFilename = 
13d10 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
13d20 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20  zFilename)+1;.  
13d30 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
13d40 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
13d50 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
13d60 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
13d70 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
13d80 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50  alloc(MAX(nFullP
13d90 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d  athname,nFilenam
13da0 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  e));.      MUTEX
13db0 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
13dc0 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
13dd0 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e  ed; )..      p->
13de0 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
13df0 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
13e00 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
13e10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13e20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
13e30 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
13e40 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
13e50 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29     if( isMemdb )
13e60 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
13e70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
13e80 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65  zFilename, nFile
13e90 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
13ea0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
13eb0 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
13ec0 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
13ed0 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ef0 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c             nFull
13f00 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
13f10 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
13f20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
13f30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
13f40 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
13f50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
13f60 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
13f70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
13f80 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
13f90 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
13fa0 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20  THREADSAFE.     
13fb0 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c   mutexOpen = sql
13fc0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
13fd0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
13fe0 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20  IC_OPEN);.      
13ff0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
14000 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ter(mutexOpen);.
14010 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
14020 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
14030 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
14040 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
14050 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14060 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
14070 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69  exShared);.#endi
14080 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d  f.      for(pBt=
14090 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
140a0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
140b0 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70  cheList); pBt; p
140c0 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
140d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
140e0 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
140f0 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74         if( 0==st
14100 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rcmp(zFullPathna
14110 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  me, sqlite3Pager
14120 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50  Filename(pBt->pP
14130 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20  ager, 0)).      
14140 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
14150 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
14160 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
14170 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
14180 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
14190 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62   for(iDb=db->nDb
141a0 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d  -1; iDb>=0; iDb-
141b0 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
141c0 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67  Btree *pExisting
141d0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
141e0 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBt;.           
141f0 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26   if( pExisting &
14200 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74  & pExisting->pBt
14210 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ==pBt ){.       
14220 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
14230 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
14240 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20  Shared);.       
14250 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
14260 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
14270 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Open);.         
14280 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
14290 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
142a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
142b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
142c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
142d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
142e0 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
142f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14300 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
14310 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
14320 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b       pBt->nRef++
14330 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
14340 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
14350 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
14360 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
14370 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
14380 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14390 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
143a0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
143b0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c  ITE_DEBUG.    el
143c0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
143d0 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d  debug mode, we m
143e0 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65  ark all persiste
143f0 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20  nt databases as 
14400 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a  sharable.      *
14410 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79  * even when they
14420 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20   are not.  This 
14430 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f  exercises the lo
14440 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20  cking code and. 
14450 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f       ** gives mo
14460 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66  re opportunity f
14470 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74  or asserts(sqlit
14480 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29  e3_mutex_held())
14490 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
144a0 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63  ents to find loc
144b0 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20  king problems.. 
144c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
144d0 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
144e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
144f0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
14500 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
14510 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
14520 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
14530 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
14540 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
14550 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a   btree are.    *
14560 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
14570 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
14580 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
14590 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
145a0 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sult.    ** when
145b0 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20   compiling on a 
145c0 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74  different archit
145d0 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ecture..    */. 
145e0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
145f0 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(i64)==8 );.   
14600 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
14610 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61  u64)==8 );.    a
14620 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
14630 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
14640 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
14650 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
14660 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
14670 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
14680 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
14690 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
146a0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
146b0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
146c0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
146d0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
146e0 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
146f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
14700 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
14710 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
14720 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
14730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14740 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
14750 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61 67 73  (MemPage), flags
14760 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
14770 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
14780 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14790 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
147a0 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
147b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62  (pBt->pPager, db
147c0 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20  ->szMmap);.     
147d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
147e0 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
147f0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
14800 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
14810 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
14820 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
14830 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14840 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
14850 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
14860 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
14870 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
14880 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
14890 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
148a0 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 2d  BusyHandler(pBt-
148b0 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
148c0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
148d0 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
148e0 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
148f0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
14900 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
14910 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  1 = 0;.    if( s
14920 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
14930 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
14940 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  r) ) pBt->btsFla
14950 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
14960 4e 4c 59 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  NLY;.#if defined
14970 28 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44  (SQLITE_SECURE_D
14980 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74 2d 3e  ELETE).    pBt->
14990 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
149a0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23  SECURE_DELETE;.#
149b0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
149c0 49 54 45 5f 46 41 53 54 5f 53 45 43 55 52 45 5f  ITE_FAST_SECURE_
149d0 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74 2d  DELETE).    pBt-
149e0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
149f0 5f 4f 56 45 52 57 52 49 54 45 3b 0a 23 65 6e 64  _OVERWRITE;.#end
14a00 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  if.    /* EVIDEN
14a10 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33  CE-OF: R-51873-3
14a20 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69  9618 The page si
14a30 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ze for a databas
14a40 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  e file is.    **
14a50 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
14a60 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65  he 2-byte intege
14a70 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20  r located at an 
14a80 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74  offset of 16 byt
14a90 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  es from.    ** t
14aa0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
14ab0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14ac0 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70  e. */.    pBt->p
14ad0 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65  ageSize = (zDbHe
14ae0 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  ader[16]<<8) | (
14af0 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31  zDbHeader[17]<<1
14b00 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  6);.    if( pBt-
14b10 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
14b20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
14b30 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
14b40 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
14b50 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
14b60 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
14b70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
14b80 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
14b90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14ba0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
14bb0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
14bc0 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
14bd0 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
14be0 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
14bf0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
14c00 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
14c10 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
14c20 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
14c30 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
14c40 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
14c50 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
14c60 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
14c70 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
14c80 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
14c90 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
14ca0 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
14cb0 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
14cc0 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
14cd0 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
14ce0 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
14cf0 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
14d00 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
14d10 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
14d20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
14d30 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
14d40 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
14d50 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
14d60 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
14d70 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
14d80 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
14d90 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
14da0 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
14db0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
14dc0 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
14dd0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
14de0 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
14df0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14e00 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
14e10 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54   R-37497-42412 T
14e20 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72  he size of the r
14e30 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69  eserved region i
14e40 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72  s.      ** deter
14e50 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
14e60 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
14e70 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
14e80 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
14e90 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68        ** into th
14ea0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14eb0 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20  header. */.     
14ec0 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
14ed0 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
14ee0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
14ef0 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
14f00 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
14f10 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14f20 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
14f30 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
14f40 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
14f50 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
14f60 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
14f70 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
14f80 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
14f90 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
14fa0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
14fb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
14fc0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
14fd0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
14fe0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
14ff0 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72  erve);.    if( r
15000 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f  c ) goto btree_o
15010 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74  pen_out;.    pBt
15020 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
15030 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
15040 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
15050 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
15060 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
15070 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
15080 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
15090 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  */.   .#if !defi
150a0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
150b0 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
150c0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
150d0 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
150e0 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
150f0 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
15100 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
15110 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
15120 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
15130 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31     pBt->nRef = 1
15140 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  ;.    if( p->sha
15150 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d  rable ){.      M
15160 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
15170 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
15180 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20  Shared; ).      
15190 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74  MUTEX_LOGIC( mut
151a0 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
151b0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
151c0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
151d0 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20  _MASTER);).     
151e0 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
151f0 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65  ADSAFE && sqlite
15200 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
15210 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  oreMutex ){.    
15220 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d      pBt->mutex =
15230 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
15240 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
15250 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69  FAST);.        i
15260 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30  f( pBt->mutex==0
15270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
15280 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
15290 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
152a0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
152b0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
152c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
152d0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
152e0 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
152f0 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
15300 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
15310 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
15320 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
15330 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
15340 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
15350 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
15360 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
15370 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
15380 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a  xShared);.    }.
15390 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20  #endif.  }..#if 
153a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
153b0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
153c0 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
153d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
153e0 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  O).  /* If the n
153f0 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20  ew Btree uses a 
15400 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72  sharable pBtShar
15410 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68  ed, then link th
15420 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65  e new.  ** Btree
15430 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   into the list o
15440 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42  f all sharable B
15450 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61  trees for the sa
15460 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  me connection.. 
15470 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   ** The list is 
15480 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e  kept in ascendin
15490 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61  g order by pBt a
154a0 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  ddress..  */.  i
154b0 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
154c0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
154d0 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20   Btree *pSib;.  
154e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
154f0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
15500 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62    if( (pSib = db
15510 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30  ->aDb[i].pBt)!=0
15520 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62   && pSib->sharab
15530 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  le ){.        wh
15540 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76  ile( pSib->pPrev
15550 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d   ){ pSib = pSib-
15560 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20  >pPrev; }.      
15570 20 20 69 66 28 20 28 75 70 74 72 29 70 2d 3e 70    if( (uptr)p->p
15580 42 74 3c 28 75 70 74 72 29 70 53 69 62 2d 3e 70  Bt<(uptr)pSib->p
15590 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
155a0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
155b0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
155c0 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
155d0 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
155e0 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
155f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
15600 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
15610 26 26 20 28 75 70 74 72 29 70 53 69 62 2d 3e 70  && (uptr)pSib->p
15620 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70 74 72 29  Next->pBt<(uptr)
15630 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
15640 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
15650 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
15660 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15670 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
15680 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
15690 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
156a0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
156b0 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
156c0 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
156d0 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
156e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
156f0 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
15700 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
15710 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15720 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15730 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
15740 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
15750 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
15760 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15770 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
15780 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
15790 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
157a0 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
157b0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
157c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
157d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
157e0 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42  ree(p);.    *ppB
157f0 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tree = 0;.  }els
15800 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  e{.    sqlite3_f
15810 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20  ile *pFile;..   
15820 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65   /* If the B-Tre
15830 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
15840 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74  ly opened, set t
15850 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
15860 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ize to the.    *
15870 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e  * default value.
15880 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70   Except, when op
15890 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73  ening on an exis
158a0 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65  ting shared page
158b0 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20  r-cache,.    ** 
158c0 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68  do not change th
158d0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69  e pager-cache si
158e0 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
158f0 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  f( sqlite3BtreeS
15900 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d  chema(p, 0, 0)==
15910 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
15920 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
15930 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ize(p->pBt->pPag
15940 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  er, SQLITE_DEFAU
15950 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a  LT_CACHE_SIZE);.
15960 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65      }..    pFile
15970 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
15980 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ile(pBt->pPager)
15990 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
159a0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
159b0 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
159c0 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c  ControlHint(pFil
159d0 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  e, SQLITE_FCNTL_
159e0 50 44 42 2c 20 28 76 6f 69 64 2a 29 26 70 42 74  PDB, (void*)&pBt
159f0 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->db);.    }.  }
15a00 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e  .  if( mutexOpen
15a10 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15a20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15a30 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b  ld(mutexOpen) );
15a40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
15a50 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
15a60 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  en);.  }.  asser
15a70 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
15a80 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65   || sqlite3Btree
15a90 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28  ConnectionCount(
15aa0 2a 70 70 42 74 72 65 65 29 3e 30 20 29 3b 0a 20  *ppBtree)>0 );. 
15ab0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15ac0 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
15ad0 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
15ae0 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
15af0 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
15b00 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
15b10 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
15b20 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
15b30 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
15b40 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
15b50 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
15b60 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
15b70 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
15b80 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
15b90 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
15ba0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
15bb0 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
15bc0 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
15bd0 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
15be0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
15bf0 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ACHE.  MUTEX_LOG
15c00 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
15c10 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20  x *pMaster; ).  
15c20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
15c30 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
15c40 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
15c50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
15c60 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
15c70 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49   );.  MUTEX_LOGI
15c80 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  C( pMaster = sql
15c90 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
15ca0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
15cb0 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20  IC_MASTER); ).  
15cc0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
15cd0 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
15ce0 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
15cf0 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
15d00 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
15d10 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
15d20 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
15d30 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
15d40 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
15d50 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
15d60 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
15d70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
15d80 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
15d90 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
15da0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
15db0 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
15dc0 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
15dd0 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
15de0 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
15df0 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
15e00 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
15e10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
15e20 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
15e30 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
15e40 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
15e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15e60 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
15e70 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
15e80 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15e90 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
15ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
15eb0 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
15ec0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
15ed0 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
15ee0 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
15ef0 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
15f00 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
15f10 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
15f20 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
15f30 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
15f40 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
15f50 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
15f60 20 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70   with a 4-byte p
15f70 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74  refix for a left
15f80 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65  -child.** pointe
15f90 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
15fa0 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
15fb0 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
15fc0 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
15fd0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
15fe0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
15ff0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
16000 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
16010 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e  ze );..    /* On
16020 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66  e of the uses of
16030 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
16040 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c  is to format cel
16050 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ls before.    **
16060 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20   inserting them 
16070 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65  into a leaf page
16080 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49   (function fillI
16090 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20  nCell()). If.   
160a0 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65   ** a cell is le
160b0 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20  ss than 4 bytes 
160c0 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72  in size, it is r
160d0 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62  ounded up to 4 b
160e0 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74  ytes.    ** by t
160f0 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69  he various routi
16100 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c  nes that manipul
16110 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73  ate binary cells
16120 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63  . Which.    ** c
16130 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c  an mean that fil
16140 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69  lInCell() only i
16150 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66  nitializes the f
16160 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20  irst 2 or 3.    
16170 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70  ** bytes of pTmp
16180 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20  Space, but that 
16190 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
161a0 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  s are copied fro
161b0 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f  m.    ** it into
161c0 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
161d0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
161e0 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d  tually a problem
161f0 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20  , but it.    ** 
16200 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c  does cause a val
16210 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e  grind error when
16220 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65   the 1 or 2 byte
16230 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64  s of unitialized
16240 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73   .    ** data is
16250 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65   passed to syste
16260 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20  m call write(). 
16270 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73  So to avoid this
16280 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a   error,.    ** z
16290 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20  ero the first 4 
162a0 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70  bytes of temp sp
162b0 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a  ace here..    **
162c0 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50  .    ** Also:  P
162d0 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65  rovide four byte
162e0 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  s of initialized
162f0 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68   space before th
16300 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69  e.    ** beginni
16310 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20  ng of pTmpSpace 
16320 61 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c  as an area avail
16330 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20  able to prepend 
16340 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d  the.    ** left-
16350 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f  child pointer to
16360 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
16370 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f  f a cell..    */
16380 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
16390 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  mpSpace ){.     
163a0 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d   memset(pBt->pTm
163b0 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20  pSpace, 0, 8);. 
163c0 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70       pBt->pTmpSp
163d0 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a  ace += 4;.    }.
163e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
163f0 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
16400 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
16410 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
16420 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
16430 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
16440 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
16450 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
16460 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20  mpSpace -= 4;.  
16470 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
16480 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e(pBt->pTmpSpace
16490 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  );.    pBt->pTmp
164a0 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Space = 0;.  }.}
164b0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
164c0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
164d0 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
164e0 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
164f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
16500 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
16510 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16520 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
16530 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
16540 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
16550 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
16560 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
16570 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16580 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
16590 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
165a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
165b0 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
165c0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
165d0 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
165e0 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
165f0 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
16600 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
16610 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
16620 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
16630 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
16640 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
16650 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
16660 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
16670 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
16680 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
16690 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
166a0 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
166b0 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
166c0 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
166d0 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
166e0 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
166f0 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
16700 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
16710 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  ck(p, SQLITE_OK,
16720 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   0);.  sqlite3Bt
16730 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
16740 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
16750 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
16760 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
16770 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
16780 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
16790 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
167a0 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
167b0 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
167c0 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
167d0 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
167e0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
167f0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
16800 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
16810 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
16820 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
16830 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
16840 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
16850 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
16860 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
16870 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
16880 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
16890 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
168a0 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
168b0 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
168c0 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
168d0 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
168e0 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
168f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
16900 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
16910 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
16920 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
16930 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b  >pPager, p->db);
16940 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
16950 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
16960 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
16970 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
16980 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
16990 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
169a0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42  ite3DbFree(0, pB
169b0 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
169c0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
169d0 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
169e0 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
169f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16a00 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
16a10 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
16a20 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
16a30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
16a40 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
16a50 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
16a60 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
16a70 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
16a80 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
16a90 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
16aa0 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
16ab0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
16ac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16ad0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
16ae0 67 65 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69  ge the "soft" li
16af0 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
16b00 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
16b10 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73  e cache..** Unus
16b20 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65  ed and unmodifie
16b30 64 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  d pages will be 
16b40 72 65 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68  recycled when th
16b50 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
16b60 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
16b70 65 20 65 78 63 65 65 64 73 20 74 68 69 73 20 73  e exceeds this s
16b80 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20  oft limit.  But 
16b90 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
16ba0 2a 2a 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f  ** cache is allo
16bb0 77 65 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67  wed to grow larg
16bc0 65 72 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d  er than this lim
16bd0 69 74 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e  it if it contain
16be0 73 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73  s.** dirty pages
16bf0 20 6f 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20   or pages still 
16c00 69 6e 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a  in active use..*
16c10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16c20 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
16c30 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
16c40 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
16c50 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16c60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16c70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
16c80 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
16c90 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
16ca0 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
16cb0 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
16cc0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
16cd0 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  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 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
16d10 67 65 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c  ge the "spill" l
16d20 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
16d30 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
16d40 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20  he cache..** If 
16d50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
16d60 67 65 73 20 65 78 63 65 65 64 73 20 74 68 69 73  ges exceeds this
16d70 20 6c 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20   limit during a 
16d80 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
16d90 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  n,.** the pager 
16da0 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f  might attempt to
16db0 20 22 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74   "spill" pages t
16dc0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61  o the journal ea
16dd0 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20  rly in.** order 
16de0 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72  to free up memor
16df0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  y..**.** The val
16e00 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
16e10 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c  he current spill
16e20 20 73 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20   size.  If zero 
16e30 69 73 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  is passed.** as 
16e40 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20  an argument, no 
16e50 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
16e60 20 74 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69   to the spill si
16e70 7a 65 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a  ze setting, so.*
16e80 2a 20 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f  * using mxPage o
16e90 66 20 30 20 69 73 20 61 20 77 61 79 20 74 6f 20  f 0 is a way to 
16ea0 71 75 65 72 79 20 74 68 65 20 63 75 72 72 65 6e  query the curren
16eb0 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f  t spill size..*/
16ec0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16ed0 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74  eSetSpillSize(Bt
16ee0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
16ef0 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
16f00 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16f10 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65   int res;.  asse
16f20 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16f30 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
16f40 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
16f50 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16f60 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50    res = sqlite3P
16f70 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65  agerSetSpillsize
16f80 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
16f90 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
16fa0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16fb0 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
16fc0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
16fd0 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a  MAP_SIZE>0./*.**
16fe0 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69   Change the limi
16ff0 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  t on the amount 
17000 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
17010 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65  file that may be
17020 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  .** memory mappe
17030 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
17040 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d  3BtreeSetMmapLim
17050 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c  it(Btree *p, sql
17060 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
17070 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
17080 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
17090 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
170a0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
170b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
170c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
170d0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
170e0 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70  erSetMmapLimit(p
170f0 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d  Bt->pPager, szMm
17100 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ap);.  sqlite3Bt
17110 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17120 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17130 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
17140 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
17150 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  E>0 */../*.** Ch
17160 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74  ange the way dat
17170 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64  a is synced to d
17180 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  isk in order to 
17190 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72  increase or decr
171a0 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c  ease.** how well
171b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
171c0 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65  sists damage due
171d0 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61   to OS crashes a
171e0 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c  nd power.** fail
171f0 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69  ures.  Level 1 i
17200 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73  s the same as as
17210 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73  ynchronous (no s
17220 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64  yncs() occur and
17230 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68  .** there is a h
17240 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  igh probability 
17250 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65  of damage)  Leve
17260 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75  l 2 is the defau
17270 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73  lt.  There.** is
17280 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20   a very low but 
17290 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69  non-zero probabi
172a0 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20  lity of damage. 
172b0 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73   Level 3 reduces
172c0 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c   the.** probabil
172d0 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f  ity of damage to
172e0 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77   near zero but w
172f0 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66  ith a write perf
17300 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
17310 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  n..*/.#ifndef SQ
17320 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
17330 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69  PRAGMAS.int sqli
17340 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72  te3BtreeSetPager
17350 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a  Flags(.  Btree *
17360 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
17370 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20  /* The btree to 
17380 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20 6c  set the safety l
17390 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73  evel on */.  uns
173a0 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20  igned pgFlags   
173b0 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50      /* Various P
173c0 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  AGER_* flags */.
173d0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
173e0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
173f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
17400 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
17410 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
17420 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17430 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
17440 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70  rSetFlags(pBt->p
17450 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b  Pager, pgFlags);
17460 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17470 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17480 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
17490 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  endif../*.** Cha
174a0 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
174b0 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74  pages size and t
174c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
174d0 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20  erved bytes per 
174e0 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  page..** Or, if 
174f0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61  the page size ha
17500 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66  s already been f
17510 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  ixed, return SQL
17520 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a  ITE_READONLY .**
17530 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
17540 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  g anything..**.*
17550 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
17560 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
17570 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
17580 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
17590 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
175a0 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
175b0 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
175c0 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
175d0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
175e0 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
175f0 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
17600 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
17610 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
17620 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
17630 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
17640 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
17650 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
17660 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
17670 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
17680 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
17690 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
176a0 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
176b0 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
176c0 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
176d0 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
176e0 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
176f0 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
17700 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
17710 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
17720 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
17730 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
17740 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
17750 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78  *.** If the iFix
17760 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53  !=0 then the BTS
17770 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
17780 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74  flag is set so t
17790 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  hat the page siz
177a0 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63  e.** and autovac
177b0 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20  uum mode can no 
177c0 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65  longer be change
177d0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
177e0 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
177f0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
17800 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
17810 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78  eserve, int iFix
17820 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
17830 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
17840 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
17850 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  t;.  assert( nRe
17860 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65  serve>=-1 && nRe
17870 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
17880 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17890 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  r(p);.#if SQLITE
178a0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
178b0 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f   nReserve>pBt->o
178c0 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20  ptimalReserve ) 
178d0 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
178e0 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72  rve = (u8)nReser
178f0 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ve;.#endif.  if(
17900 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
17910 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
17920 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  XED ){.    sqlit
17930 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17940 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17950 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
17960 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
17970 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
17980 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
17990 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
179a0 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
179b0 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
179c0 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
179d0 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
179e0 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
179f0 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
17a00 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
17a10 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
17a20 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
17a30 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
17a40 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
17a50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
17a60 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
17a70 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
17a80 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a  e = (u32)pageSiz
17a90 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
17aa0 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20  pace(pBt);.  }. 
17ab0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17ac0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
17ad0 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
17ae0 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
17af0 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61  rve);.  pBt->usa
17b00 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
17b10 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e  ageSize - (u16)n
17b20 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69  Reserve;.  if( i
17b30 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  Fix ) pBt->btsFl
17b40 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
17b50 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c  IZE_FIXED;.  sql
17b60 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17b70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17b80 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
17b90 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
17ba0 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
17bb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17bc0 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
17bd0 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
17be0 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
17bf0 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
17c00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
17c10 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
17c20 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
17c30 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
17c40 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62  it.** may only b
17c50 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69  e called if it i
17c60 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
17c70 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74  t the b-tree mut
17c80 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  ex is already.**
17c90 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   held..**.** Thi
17ca0 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f  s is useful in o
17cb0 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  ne special case 
17cc0 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  in the backup AP
17cd0 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20  I code where it 
17ce0 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74  is.** known that
17cf0 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72   the shared b-tr
17d00 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64  ee mutex is held
17d10 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20  , but the mutex 
17d20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  on the .** datab
17d30 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
17d40 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20  owns *p is not. 
17d50 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20  In this case if 
17d60 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17d70 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62  r().** were to b
17d80 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67  e called, it mig
17d90 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ht collide with 
17da0 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61  some other opera
17db0 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  tion on the.** d
17dc0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
17dd0 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75  hat owns *p, cau
17de0 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62  sing undefined b
17df0 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  ehavior..*/.int 
17e00 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
17e10 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74  eserveNoMutex(Bt
17e20 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
17e30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
17e40 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17e50 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
17e60 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70  .  n = p->pBt->p
17e70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
17e80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
17e90 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
17ea0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
17eb0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
17ec0 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
17ed0 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
17ee0 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65  that.** are inte
17ef0 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75  ntually left unu
17f00 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  sed.  This is th
17f10 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61  e "reserved" spa
17f20 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f  ce that is.** so
17f30 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20  metimes used by 
17f40 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a  extensions..**.*
17f50 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  * If SQLITE_HAS_
17f60 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e 65 64  MUTEX is defined
17f70 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
17f80 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
17f90 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74  .** greater of t
17fa0 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 65 72  he current reser
17fb0 76 65 64 20 73 70 61 63 65 20 61 6e 64 20 74 68  ved space and th
17fc0 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73  e maximum reques
17fd0 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73  ted.** reserve s
17fe0 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pace..*/.int sql
17ff0 69 74 65 33 42 74 72 65 65 47 65 74 4f 70 74 69  ite3BtreeGetOpti
18000 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72 65 65  malReserve(Btree
18010 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
18020 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
18030 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
18040 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
18050 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23  rveNoMutex(p);.#
18060 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
18070 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70  _CODEC.  if( n<p
18080 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ->pBt->optimalRe
18090 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70  serve ) n = p->p
180a0 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
180b0 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  ve;.#endif.  sql
180c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
180d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
180e0 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  .../*.** Set the
180f0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
18100 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
18110 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
18120 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
18130 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
18140 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
18150 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
18160 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
18170 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
18180 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
18190 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
181a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
181b0 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
181c0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
181d0 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
181e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
181f0 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
18200 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
18210 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
18220 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
18230 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
18240 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
18250 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn n;.}../*.** C
18260 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 73  hange the values
18270 20 66 6f 72 20 74 68 65 20 42 54 53 5f 53 45 43   for the BTS_SEC
18280 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20 42  URE_DELETE and B
18290 54 53 5f 4f 56 45 52 57 52 49 54 45 20 66 6c 61  TS_OVERWRITE fla
182a0 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6e 65 77  gs:.**.**    new
182b0 46 6c 61 67 3d 3d 30 20 20 20 20 20 20 20 42 6f  Flag==0       Bo
182c0 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  th BTS_SECURE_DE
182d0 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45  LETE and BTS_OVE
182e0 52 57 52 49 54 45 20 61 72 65 20 63 6c 65 61 72  RWRITE are clear
182f0 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67  ed.**    newFlag
18300 3d 3d 31 20 20 20 20 20 20 20 42 54 53 5f 53 45  ==1       BTS_SE
18310 43 55 52 45 5f 44 45 4c 45 54 45 20 73 65 74 20  CURE_DELETE set 
18320 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54  and BTS_OVERWRIT
18330 45 20 69 73 20 63 6c 65 61 72 65 64 0a 2a 2a 20  E is cleared.** 
18340 20 20 20 6e 65 77 46 6c 61 67 3d 3d 32 20 20 20     newFlag==2   
18350 20 20 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44      BTS_SECURE_D
18360 45 4c 45 54 45 20 63 6c 65 61 72 65 64 20 61 6e  ELETE cleared an
18370 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20  d BTS_OVERWRITE 
18380 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 6e 65 77  is set.**    new
18390 46 6c 61 67 3d 3d 28 2d 31 29 20 20 20 20 4e 6f  Flag==(-1)    No
183a0 20 63 68 61 6e 67 65 73 0a 2a 2a 0a 2a 2a 20 54   changes.**.** T
183b0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
183c0 20 61 73 20 61 20 71 75 65 72 79 20 69 66 20 6e   as a query if n
183d0 65 77 46 6c 61 67 20 69 73 20 6c 65 73 73 20 74  ewFlag is less t
183e0 68 61 6e 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20 57  han zero.**.** W
183f0 69 74 68 20 42 54 53 5f 4f 56 45 52 57 52 49 54  ith BTS_OVERWRIT
18400 45 20 73 65 74 2c 20 64 65 6c 65 74 65 64 20 63  E set, deleted c
18410 6f 6e 74 65 6e 74 20 69 73 20 6f 76 65 72 77 72  ontent is overwr
18420 69 74 74 65 6e 20 62 79 20 7a 65 72 6f 73 2c 20  itten by zeros, 
18430 62 75 74 0a 2a 2a 20 66 72 65 65 6c 69 73 74 20  but.** freelist 
18440 6c 65 61 66 20 70 61 67 65 73 20 61 72 65 20 6e  leaf pages are n
18450 6f 74 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  ot written back 
18460 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
18470 20 20 54 68 75 73 20 69 6e 2d 70 61 67 65 0a 2a    Thus in-page.*
18480 2a 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e  * deleted conten
18490 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 62 75  t is cleared, bu
184a0 74 20 66 72 65 65 6c 69 73 74 20 64 65 6c 65 74  t freelist delet
184b0 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ed content is no
184c0 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54  t..**.** With BT
184d0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2c  S_SECURE_DELETE,
184e0 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 6c 69   operation is li
184f0 6b 65 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  ke BTS_OVERWRITE
18500 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69   with the additi
18510 6f 6e 0a 2a 2a 20 74 68 61 74 20 66 72 65 65 6c  on.** that freel
18520 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 61  ist leaf pages a
18530 72 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  re written back 
18540 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
18550 65 2c 20 69 6e 63 72 65 61 73 69 6e 67 0a 2a 2a  e, increasing.**
18560 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64   the amount of d
18570 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20  isk I/O..*/.int 
18580 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
18590 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a  reDelete(Btree *
185a0 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b  p, int newFlag){
185b0 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20  .  int b;.  if( 
185c0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
185d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
185e0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
185f0 74 28 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45  t( BTS_OVERWRITE
18600 3d 3d 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  ==BTS_SECURE_DEL
18610 45 54 45 2a 32 20 29 3b 0a 20 20 61 73 73 65 72  ETE*2 );.  asser
18620 74 28 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55  t( BTS_FAST_SECU
18630 52 45 3d 3d 28 42 54 53 5f 4f 56 45 52 57 52 49  RE==(BTS_OVERWRI
18640 54 45 7c 42 54 53 5f 53 45 43 55 52 45 5f 44 45  TE|BTS_SECURE_DE
18650 4c 45 54 45 29 20 29 3b 0a 20 20 69 66 28 20 6e  LETE) );.  if( n
18660 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20  ewFlag>=0 ){.   
18670 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67   p->pBt->btsFlag
18680 73 20 26 3d 20 7e 42 54 53 5f 46 41 53 54 5f 53  s &= ~BTS_FAST_S
18690 45 43 55 52 45 3b 0a 20 20 20 20 70 2d 3e 70 42  ECURE;.    p->pB
186a0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
186b0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
186c0 2a 6e 65 77 46 6c 61 67 3b 0a 20 20 7d 0a 20 20  *newFlag;.  }.  
186d0 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73  b = (p->pBt->bts
186e0 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54  Flags & BTS_FAST
186f0 5f 53 45 43 55 52 45 29 2f 42 54 53 5f 53 45 43  _SECURE)/BTS_SEC
18700 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 73 71  URE_DELETE;.  sq
18710 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
18720 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a  p);.  return b;.
18730 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
18740 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
18750 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
18760 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
18770 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
18780 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
18790 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
187a0 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
187b0 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
187c0 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
187d0 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
187e0 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
187f0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
18800 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
18810 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
18820 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
18830 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
18840 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18850 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
18860 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
18870 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
18880 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18890 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
188a0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
188b0 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
188c0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
188d0 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
188e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
188f0 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
18900 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
18910 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18920 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
18930 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
18940 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26 20 28  E_FIXED)!=0 && (
18950 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
18960 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
18970 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
18980 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
18990 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
189a0 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
189b0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
189c0 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
189d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
189e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
189f0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
18a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
18a10 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
18a20 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
18a30 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
18a40 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
18a50 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
18a60 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
18a70 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
18a80 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
18a90 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
18aa0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
18ab0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
18ac0 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
18ad0 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
18ae0 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
18af0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18b00 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
18b10 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
18b20 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
18b30 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
18b40 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
18b50 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
18b60 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
18b70 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
18b80 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
18b90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
18ba0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
18bb0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
18bc0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72  *.** If the user
18bd0 20 68 61 73 20 6e 6f 74 20 73 65 74 20 74 68 65   has not set the
18be0 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f   safety-level fo
18bf0 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
18c00 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73  connection.** us
18c10 69 6e 67 20 22 50 52 41 47 4d 41 20 73 79 6e 63  ing "PRAGMA sync
18c20 68 72 6f 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66  hronous", and if
18c30 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65   the safety-leve
18c40 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
18c50 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 76  .** set to the v
18c60 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 74  alue passed to t
18c70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 20  his function as 
18c80 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
18c90 65 74 65 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20  eter,.** set it 
18ca0 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  so..*/.#if SQLIT
18cb0 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52  E_DEFAULT_SYNCHR
18cc0 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f 44 45  ONOUS!=SQLITE_DE
18cd0 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52  FAULT_WAL_SYNCHR
18ce0 4f 4e 4f 55 53 20 5c 0a 20 20 20 20 26 26 20 21  ONOUS \.    && !
18cf0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
18d00 4d 49 54 5f 57 41 4c 29 0a 73 74 61 74 69 63 20  MIT_WAL).static 
18d10 76 6f 69 64 20 73 65 74 44 65 66 61 75 6c 74 53  void setDefaultS
18d20 79 6e 63 46 6c 61 67 28 42 74 53 68 61 72 65 64  yncFlag(BtShared
18d30 20 2a 70 42 74 2c 20 75 38 20 73 61 66 65 74 79   *pBt, u8 safety
18d40 5f 6c 65 76 65 6c 29 7b 0a 20 20 73 71 6c 69 74  _level){.  sqlit
18d50 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 70 44  e3 *db;.  Db *pD
18d60 62 3b 0a 20 20 69 66 28 20 28 64 62 3d 70 42 74  b;.  if( (db=pBt
18d70 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70 44 62  ->db)!=0 && (pDb
18d80 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29 7b 0a  =db->aDb)!=0 ){.
18d90 20 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e      while( pDb->
18da0 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70  pBt==0 || pDb->p
18db0 42 74 2d 3e 70 42 74 21 3d 70 42 74 20 29 7b 20  Bt->pBt!=pBt ){ 
18dc0 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  pDb++; }.    if(
18dd0 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74 3d 3d   pDb->bSyncSet==
18de0 30 20 0a 20 20 20 20 20 26 26 20 70 44 62 2d 3e  0 .     && pDb->
18df0 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d 73 61  safety_level!=sa
18e00 66 65 74 79 5f 6c 65 76 65 6c 20 0a 20 20 20 20  fety_level .    
18e10 20 26 26 20 70 44 62 21 3d 26 64 62 2d 3e 61 44   && pDb!=&db->aD
18e20 62 5b 31 5d 20 0a 20 20 20 20 29 7b 0a 20 20 20  b[1] .    ){.   
18e30 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c     pDb->safety_l
18e40 65 76 65 6c 20 3d 20 73 61 66 65 74 79 5f 6c 65  evel = safety_le
18e50 76 65 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  vel;.      sqlit
18e60 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
18e70 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a 20 20 20  pBt->pPager,.   
18e80 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65         pDb->safe
18e90 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62 2d 3e  ty_level | (db->
18ea0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46 4c  flags & PAGER_FL
18eb0 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20 20 20  AGS_MASK));.    
18ec0 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
18ed0 64 65 66 69 6e 65 20 73 65 74 44 65 66 61 75 6c  define setDefaul
18ee0 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 73 61  tSyncFlag(pBt,sa
18ef0 66 65 74 79 5f 6c 65 76 65 6c 29 0a 23 65 6e 64  fety_level).#end
18f00 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  if../*.** Get a 
18f10 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
18f20 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
18f30 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
18f40 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
18f50 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
18f60 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
18f70 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
18f80 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
18f90 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
18fa0 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
18fb0 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
18fc0 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
18fd0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
18fe0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
18ff0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
19000 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
19010 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
19020 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
19030 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
19040 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
19050 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69  emory. .*/.stati
19060 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28  c int lockBtree(
19070 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
19080 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
19090 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
190a0 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
190b0 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d  nctions */.  Mem
190c0 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20  Page *pPage1;   
190d0 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74    /* Page 1 of t
190e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
190f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
19100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19110 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
19120 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
19130 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65  .  int nPageFile
19140 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
19150 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
19160 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19170 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65  */.  int nPageHe
19180 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  ader;     /* Num
19190 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
191a0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63 63  the database acc
191b0 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f  ording to hdr */
191c0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
191d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
191e0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
191f0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
19200 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  ge1==0 );.  rc =
19210 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
19220 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61  redLock(pBt->pPa
19230 67 65 72 2c 20 70 42 74 2d 3e 64 62 2d 3e 72 65  ger, pBt->db->re
19240 61 64 6f 6e 6c 79 54 72 61 6e 73 29 3b 0a 20 20  adonlyTrans);.  
19250 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19260 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
19270 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
19280 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
19290 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  e1, 0);.  if( rc
192a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
192b0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44  turn rc;..  /* D
192c0 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20  o some checking 
192d0 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74  to help insure t
192e0 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65  he file we opene
192f0 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a  d really is.  **
19300 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73   a valid databas
19310 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20  e file. .  */.  
19320 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61  nPage = nPageHea
19330 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32  der = get4byte(2
19340 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
19350 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  Data);.  sqlite3
19360 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
19370 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
19380 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e  geFile);.  if( n
19390 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  Page==0 || memcm
193a0 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31  p(24+(u8*)pPage1
193b0 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a  ->aData, 92+(u8*
193c0 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34  )pPage1->aData,4
193d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67  )!=0 ){.    nPag
193e0 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20  e = nPageFile;. 
193f0 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30   }.  if( nPage>0
19400 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65   ){.    u32 page
19410 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73  Size;.    u32 us
19420 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38  ableSize;.    u8
19430 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31   *page1 = pPage1
19440 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20  ->aData;.    u8 
19450 69 31 38 20 3d 20 70 61 67 65 31 5b 31 38 5d 3b  i18 = page1[18];
19460 0a 20 20 20 20 75 38 20 69 31 39 20 3d 20 70 61  .    u8 i19 = pa
19470 67 65 31 5b 31 39 5d 3b 0a 23 69 66 64 65 66 20  ge1[19];.#ifdef 
19480 53 51 4c 49 54 45 5f 53 45 52 56 45 52 5f 45 44  SQLITE_SERVER_ED
19490 49 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 69 31  ITION.    if( i1
194a0 38 3d 3d 69 31 39 20 26 26 20 69 31 38 3e 32 20  8==i19 && i18>2 
194b0 29 7b 0a 20 20 20 20 20 20 69 31 38 20 2d 3d 20  ){.      i18 -= 
194c0 32 3b 0a 20 20 20 20 20 20 69 31 39 20 2d 3d 20  2;.      i19 -= 
194d0 32 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  2;.    }.#endif.
194e0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
194f0 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20  _NOTADB;.    /* 
19500 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
19510 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72 79  3737-39999 Every
19520 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61   valid SQLite da
19530 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67 69  tabase file begi
19540 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  ns.    ** with t
19550 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20  he following 16 
19560 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20  bytes (in hex): 
19570 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20 36  53 51 4c 69 74 6
19580 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36 64  5 20 66 6f 72 6d
19590 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30  .    ** 61 74 20
195a0 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69   33 00. */.    i
195b0 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
195c0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
195d0 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
195e0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
195f0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69  ailed;.    }..#i
19600 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
19610 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 69 31 38  _WAL.    if( i18
19620 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >1 ){.      pBt-
19630 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
19640 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20  _READ_ONLY;.    
19650 7d 0a 20 20 20 20 69 66 28 20 69 31 39 3e 31 20  }.    if( i19>1 
19660 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
19670 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19680 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
19690 20 69 66 28 20 69 31 38 3e 32 20 29 7b 0a 20 20   if( i18>2 ){.  
196a0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
196b0 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
196c0 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
196d0 28 20 69 31 39 3e 32 20 29 7b 0a 20 20 20 20 20  ( i19>2 ){.     
196e0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
196f0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
19700 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72      /* If the wr
19710 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73  ite version is s
19720 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61  et to 2, this da
19730 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65  tabase should be
19740 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a   accessed.    **
19750 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66   in WAL mode. If
19760 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20   the log is not 
19770 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70  already open, op
19780 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20  en it now. Then 
19790 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  .    ** return S
197a0 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74  QLITE_OK and ret
197b0 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75  urn without popu
197c0 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e  lating BtShared.
197d0 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54  pPage1..    ** T
197e0 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74  he caller detect
197f0 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73  s this and calls
19800 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
19810 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20  gain. This is.  
19820 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73    ** required as
19830 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20   the version of 
19840 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79  page 1 currently
19850 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75   in the page1 bu
19860 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ffer.    ** may 
19870 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73  not be the lates
19880 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72  t version - ther
19890 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72  e may be a newer
198a0 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a   one in the log.
198b0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
198c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 31 39 3d   */.    if( i19=
198d0 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  =2 && (pBt->btsF
198e0 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41  lags & BTS_NO_WA
198f0 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  L)==0 ){.      i
19900 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  nt isOpen = 0;. 
19910 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19920 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42  3PagerOpenWal(pB
19930 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70  t->pPager, &isOp
19940 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  en);.      if( r
19950 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19960 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
19970 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19980 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19990 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53       setDefaultS
199a0 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c  yncFlag(pBt, SQL
199b0 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
199c0 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a  SYNCHRONOUS+1);.
199d0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70          if( isOp
199e0 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  en==0 ){.       
199f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e     releasePageOn
19a00 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
19a10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19a20 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
19a30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
19a40 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
19a50 42 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  B;.    }else{.  
19a60 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79      setDefaultSy
19a70 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49  ncFlag(pBt, SQLI
19a80 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48  TE_DEFAULT_SYNCH
19a90 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d  RONOUS+1);.    }
19aa0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
19ab0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
19ac0 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d  5465-20813 The m
19ad0 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d  aximum and minim
19ae0 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c  um embedded payl
19af0 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74  oad.    ** fract
19b00 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61  ions and the lea
19b10 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69  f payload fracti
19b20 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  on values must b
19b30 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32  e 64, 32, and 32
19b40 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
19b50 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
19b60 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73  ign allowed thes
19b70 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72  e amounts to var
19b80 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20  y, but as of.   
19b90 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e   ** version 3.6.
19ba0 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68  0, we require th
19bb0 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a  em to be fixed..
19bc0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d      */.    if( m
19bd0 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d  emcmp(&page1[21]
19be0 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22  , "\100\040\040"
19bf0 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,3)!=0 ){.      
19c00 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
19c10 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
19c20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19c30 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20  : R-51873-39618 
19c40 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f  The page size fo
19c50 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  r a database fil
19c60 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  e is.    ** dete
19c70 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d  rmined by the 2-
19c80 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63  byte integer loc
19c90 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ated at an offse
19ca0 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72  t of 16 bytes fr
19cb0 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65  om.    ** the be
19cc0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
19cd0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
19ce0 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
19cf0 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c  (page1[16]<<8) |
19d00 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29   (page1[17]<<16)
19d10 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
19d20 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31  E-OF: R-25008-21
19d30 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20  688 The size of 
19d40 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65  a page is a powe
19d50 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20  r of two.    ** 
19d60 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
19d70 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e  65536 inclusive.
19d80 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61   */.    if( ((pa
19d90 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
19da0 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
19db0 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
19dc0 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
19dd0 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
19de0 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
19df0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
19e00 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
19e10 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
19e20 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
19e30 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19e40 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32  -OF: R-59310-512
19e50 30 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64  05 The "reserved
19e60 20 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20   space" size in 
19e70 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a  the 1-byte.    *
19e80 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  * integer at off
19e90 73 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75  set 20 is the nu
19ea0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
19eb0 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
19ec0 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68  d of.    ** each
19ed0 20 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65   page to reserve
19ee0 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e   for extensions.
19ef0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
19f00 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
19f10 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
19f20 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
19f30 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
19f40 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
19f50 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
19f60 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
19f70 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
19f80 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a  set of 20.    **
19f90 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
19fa0 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
19fb0 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  */.    usableSiz
19fc0 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
19fd0 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
19fe0 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21  ( (u32)pageSize!
19ff0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
1a000 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
1a010 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
1a020 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1a030 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
1a040 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
1a050 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
1a060 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
1a070 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
1a080 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
1a090 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
1a0a0 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
1a0b0 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
1a0c0 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
1a0d0 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
1a0e0 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
1a0f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
1a100 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
1a110 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
1a120 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
1a130 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
1a140 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
1a150 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
1a160 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65  asePageOne(pPage
1a170 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75  1);.      pBt->u
1a180 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
1a190 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42  leSize;.      pB
1a1a0 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
1a1b0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72  geSize;.      fr
1a1c0 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
1a1d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1a1e0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
1a1f0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
1a200 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
1a210 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a230 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73       pageSize-us
1a240 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
1a250 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a260 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e  }.    if( (pBt->
1a270 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1a280 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d  TE_WriteSchema)=
1a290 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
1a2a0 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
1a2b0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1a2c0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
1a2d0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1a2e0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
1a2f0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1a300 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48   R-28312-64704 H
1a310 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62  owever, the usab
1a320 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  le size is not a
1a330 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a  llowed to.    **
1a340 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38   be less than 48
1a350 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  0. In other word
1a360 73 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  s, if the page s
1a370 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e  ize is 512, then
1a380 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65   the.    ** rese
1a390 72 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20  rved space size 
1a3a0 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32  cannot exceed 32
1a3b0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61  . */.    if( usa
1a3c0 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20  bleSize<480 ){. 
1a3d0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1a3e0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1a3f0 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65   }.    pBt->page
1a400 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
1a410 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
1a420 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
1a430 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
1a440 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1a450 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  M.    pBt->autoV
1a460 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
1a470 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a  e(&page1[36 + 4*
1a480 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42  4])?1:0);.    pB
1a490 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
1a4a0 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
1a4b0 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
1a4c0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
1a4d0 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
1a4e0 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
1a4f0 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
1a500 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
1a510 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
1a520 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
1a530 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
1a540 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
1a550 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
1a560 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
1a570 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
1a580 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
1a590 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
1a5a0 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
1a5b0 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
1a5c0 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
1a5d0 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
1a5e0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
1a5f0 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
1a600 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
1a610 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
1a620 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
1a630 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
1a640 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
1a650 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
1a660 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
1a670 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
1a680 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
1a690 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64   pointer, a head
1a6a0 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
1a6b0 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
1a6c0 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
1a6d0 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
1a6e0 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
1a6f0 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
1a700 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
1a710 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
1a720 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75  t->maxLocal = (u
1a730 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
1a740 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
1a750 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 23);.  pBt->mi
1a760 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  nLocal = (u16)((
1a770 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
1a780 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
1a790 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
1a7a0 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
1a7b0 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a  ableSize - 35);.
1a7c0 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
1a7d0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
1a7e0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
1a7f0 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20  55 - 23);.  if( 
1a800 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32  pBt->maxLocal>12
1a810 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  7 ){.    pBt->ma
1a820 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
1a830 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  127;.  }else{.  
1a840 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
1a850 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74  ayload = (u8)pBt
1a860 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->maxLocal;.  }.
1a870 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
1a880 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
1a890 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
1a8a0 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
1a8b0 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42  1 = pPage1;.  pB
1a8c0 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
1a8d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1a8e0 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
1a8f0 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
1a900 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65  asePageOne(pPage
1a910 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
1a920 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
1a930 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
1a940 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
1a950 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1a960 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
1a970 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f   pBt. This is fo
1a980 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
1a990 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
1a9a0 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
1a9b0 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
1a9c0 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
1a9d0 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ined..**.** Only
1a9e0 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
1a9f0 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72  re counted if wr
1aa00 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49  Only is true.  I
1aa10 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66  f wrOnly is.** f
1aa20 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75  alse then all cu
1aa30 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
1aa40 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
1aa50 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
1aa60 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72  s routine, a cur
1aa70 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
1aa80 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
1aa90 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20  able of reading 
1aaa0 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  or writing to th
1aab0 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72  e database.  Cur
1aac0 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
1aad0 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
1aae0 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
1aaf0 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
1ab00 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
1ab10 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
1ab20 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
1ab30 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
1ab40 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
1ab50 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
1ab60 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
1ab70 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
1ab80 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
1ab90 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1aba0 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
1abb0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
1abc0 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
1abd0 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
1abe0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1abf0 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
1ac00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
1ac10 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1ac20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
1ac30 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
1ac40 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
1ac50 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
1ac60 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
1ac70 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
1ac80 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
1ac90 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
1aca0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
1acb0 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
1acc0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1acd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
1ace0 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
1acf0 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
1ad00 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
1ad10 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1ad20 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
1ad30 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
1ad40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1ad50 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1ad60 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
1ad70 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
1ad80 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
1ad90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1ada0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1adb0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1adc0 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
1add0 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
1ade0 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
1adf0 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
1ae00 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
1ae10 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1ae20 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
1ae30 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
1ae40 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1ae50 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1ae60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1ae70 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
1ae80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1ae90 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
1aea0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
1aeb0 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
1aec0 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
1aed0 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
1aee0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1aef0 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20  f pBt points to 
1af00 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68  an empty file th
1af10 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
1af20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e  empty file.** in
1af30 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64  to a new empty d
1af40 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
1af50 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
1af60 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65  t page of.** the
1af70 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1af80 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61  atic int newData
1af90 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70  base(BtShared *p
1afa0 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
1afb0 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pP1;.  unsigned 
1afc0 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e  char *data;.  in
1afd0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1afe0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1aff0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1b000 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  );.  if( pBt->nP
1b010 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  age>0 ){.    ret
1b020 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b030 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e   }.  pP1 = pBt->
1b040 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
1b050 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
1b060 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
1b070 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1b080 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
1b090 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
1b0a0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1b0b0 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
1b0c0 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
1b0d0 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
1b0e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
1b0f0 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
1b100 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b  )==16 );.  data[
1b110 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  16] = (u8)((pBt-
1b120 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78  >pageSize>>8)&0x
1b130 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20  ff);.  data[17] 
1b140 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
1b150 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29  eSize>>16)&0xff)
1b160 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31  ;.  data[18] = 1
1b170 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31  ;.  data[19] = 1
1b180 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1b190 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74  >usableSize<=pBt
1b1a0 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42  ->pageSize && pB
1b1b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35  t->usableSize+25
1b1c0 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  5>=pBt->pageSize
1b1d0 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20  );.  data[20] = 
1b1e0 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
1b1f0 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze - pBt->usable
1b200 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31  Size);.  data[21
1b210 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32  ] = 64;.  data[2
1b220 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b  2] = 32;.  data[
1b230 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73  23] = 32;.  mems
1b240 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c  et(&data[24], 0,
1b250 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f   100-24);.  zero
1b260 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e  Page(pP1, PTF_IN
1b270 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54  TKEY|PTF_LEAF|PT
1b280 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20  F_LEAFDATA );.  
1b290 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1b2a0 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
1b2b0 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  XED;.#ifndef SQL
1b2c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1b2d0 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
1b2e0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
1b2f0 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
1b300 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
1b310 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
1b320 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
1b330 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
1b340 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
1b350 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
1b360 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
1b370 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
1b380 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
1b390 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
1b3a0 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  if.  pBt->nPage 
1b3b0 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20  = 1;.  data[31] 
1b3c0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
1b3d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1b3e0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1b3f0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
1b400 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b410 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74   (creating a dat
1b420 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74  abase.** consist
1b430 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
1b440 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65  page and no sche
1b450 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74  ma objects). Ret
1b460 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
1b470 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
1b480 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
1b490 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
1b4a0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1b4b0 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65  3BtreeNewDb(Btre
1b4c0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1b4d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1b4e0 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
1b4f0 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
1b500 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1b510 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69  (p->pBt);.  sqli
1b520 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1b530 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1b540 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
1b550 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
1b560 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
1b570 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
1b580 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
1b590 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1b5a0 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
1b5b0 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
1b5c0 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
1b5d0 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
1b5e0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
1b5f0 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
1b600 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
1b610 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
1b620 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
1b630 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
1b640 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
1b650 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
1b660 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
1b670 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
1b680 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
1b690 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
1b6a0 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
1b6b0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
1b6c0 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
1b6d0 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
1b6e0 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
1b6f0 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
1b700 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
1b710 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1b720 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
1b730 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
1b740 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
1b750 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1b760 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
1b770 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
1b780 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
1b790 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
1b7a0 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
1b7b0 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
1b7c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1b7d0 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
1b7e0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1b7f0 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
1b800 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1b810 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
1b820 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1b830 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
1b840 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1b850 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
1b860 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1b870 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
1b880 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
1b890 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
1b8a0 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
1b8b0 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
1b8c0 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
1b8d0 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
1b8e0 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
1b8f0 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1b900 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
1b910 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
1b920 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1b930 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
1b940 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
1b950 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
1b960 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
1b970 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
1b980 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
1b990 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
1b9a0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
1b9b0 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
1b9c0 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
1b9d0 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
1b9e0 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
1b9f0 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
1ba00 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
1ba10 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
1ba20 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
1ba30 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
1ba40 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
1ba50 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
1ba60 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
1ba70 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
1ba80 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
1ba90 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
1baa0 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
1bab0 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
1bac0 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
1bad0 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
1bae0 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
1baf0 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
1bb00 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
1bb10 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
1bb20 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
1bb30 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
1bb40 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
1bb50 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
1bb60 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
1bb70 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
1bb80 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
1bb90 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
1bba0 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
1bbb0 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
1bbc0 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
1bbd0 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
1bbe0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
1bbf0 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
1bc00 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74  nt wrflag){.  Bt
1bc10 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1bc20 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
1bc30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
1bc40 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1bc50 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
1bc60 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
1bc70 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
1bc80 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
1bc90 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
1bca0 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
1bcb0 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
1bcc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
1bcd0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
1bce0 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
1bcf0 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
1bd00 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
1bd10 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1bd20 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
1bd30 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1bd40 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
1bd50 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
1bd60 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20  ns_begun;.  }.  
1bd70 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1bd80 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1bd90 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74  S_WRITE || IfNot
1bda0 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
1bdb0 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a  runcate)==0 );..
1bdc0 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
1bdd0 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
1bde0 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
1bdf0 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
1be00 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e   */.  if( (pBt->
1be10 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1be20 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20  EAD_ONLY)!=0 && 
1be30 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
1be40 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
1be50 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
1be60 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
1be70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1be80 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1be90 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20    {.    sqlite3 
1bea0 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  *pBlock = 0;.   
1beb0 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
1bec0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
1bed0 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
1bee0 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
1bef0 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e  ction .    ** on
1bf00 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
1bf10 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
1bf20 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
1bf30 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
1bf40 20 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c     ** requested,
1bf50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
1bf60 4f 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  OCKED..    */.  
1bf70 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26    if( (wrflag &&
1bf80 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1bf90 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1bfa0 29 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e  ).     || (pBt->
1bfb0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
1bfc0 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29  ENDING)!=0.    )
1bfd0 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d  {.      pBlock =
1bfe0 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
1bff0 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  b;.    }else if(
1c000 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
1c010 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
1c020 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65  ;.      for(pIte
1c030 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
1c040 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
1c050 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1c060 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
1c070 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
1c080 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74      pBlock = pIt
1c090 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  er->pBtree->db;.
1c0a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c0b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c0c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1c0d0 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20   pBlock ){.     
1c0e0 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
1c0f0 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
1c100 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20   pBlock);.      
1c110 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
1c120 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
1c130 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73        goto trans
1c140 5f 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20  _begun;.    }.  
1c150 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
1c160 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
1c170 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
1c180 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
1c190 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
1c1a0 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
1c1b0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
1c1c0 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
1c1d0 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
1c1e0 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
1c1f0 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
1c200 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
1c210 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
1c220 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
1c230 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1c240 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
1c250 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
1c260 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
1c270 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
1c280 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73  gun;..  pBt->bts
1c290 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e  Flags &= ~BTS_IN
1c2a0 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
1c2b0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
1c2c0 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  =0 ) pBt->btsFla
1c2d0 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41  gs |= BTS_INITIA
1c2e0 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20  LLY_EMPTY;.  do 
1c2f0 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
1c300 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
1c310 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
1c320 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
1c330 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
1c340 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
1c350 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
1c360 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
1c370 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
1c380 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
1c390 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
1c3a0 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
1c3b0 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
1c3c0 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
1c3d0 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
1c3e0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
1c3f0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1c400 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
1c410 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
1c420 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
1c430 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
1c440 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
1c450 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
1c460 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
1c470 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
1c480 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
1c490 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
1c4a0 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
1c4b0 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
1c4c0 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
1c4d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c4e0 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
1c4f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42  ){.      if( (pB
1c500 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1c510 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
1c520 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c530 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1c540 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c550 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c560 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
1c570 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
1c580 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
1c590 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
1c5a0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1c5b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c5c0 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1c5d0 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1c5e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c5f0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
1c600 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c610 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
1c620 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1c630 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
1c640 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
1c650 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
1c660 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1c670 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
1c680 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
1c690 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
1c6a0 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  t) );.  sqlite3P
1c6b0 61 67 65 72 52 65 73 65 74 4c 6f 63 6b 54 69 6d  agerResetLockTim
1c6c0 65 6f 75 74 28 70 42 74 2d 3e 70 50 61 67 65 72  eout(pBt->pPager
1c6d0 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
1c6e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1c6f0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1c700 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1c710 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
1c720 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  tion++;.#ifndef 
1c730 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1c740 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69  ED_CACHE.      i
1c750 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
1c760 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1c770 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65  ( p->lock.pBtree
1c780 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69  ==p && p->lock.i
1c790 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
1c7a0 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63      p->lock.eLoc
1c7b0 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20  k = READ_LOCK;. 
1c7c0 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70         p->lock.p
1c7d0 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63  Next = pBt->pLoc
1c7e0 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  k;.        pBt->
1c7f0 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b  pLock = &p->lock
1c800 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1c810 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e  .    }.    p->in
1c820 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f  Trans = (wrflag?
1c830 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e  TRANS_WRITE:TRAN
1c840 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28  S_READ);.    if(
1c850 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d   p->inTrans>pBt-
1c860 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
1c870 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
1c880 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e  ransaction = p->
1c890 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20  inTrans;.    }. 
1c8a0 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b     if( wrflag ){
1c8b0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1c8c0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
1c8d0 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51  age1;.#ifndef SQ
1c8e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1c8f0 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73  _CACHE.      ass
1c900 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74  ert( !pBt->pWrit
1c910 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  er );.      pBt-
1c920 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20  >pWriter = p;.  
1c930 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
1c940 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53  s &= ~BTS_EXCLUS
1c950 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77  IVE;.      if( w
1c960 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62  rflag>1 ) pBt->b
1c970 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45  tsFlags |= BTS_E
1c980 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66  XCLUSIVE;.#endif
1c990 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
1c9a0 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72  e db-size header
1c9b0 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72   field is incorr
1c9c0 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62  ect (as it may b
1c9d0 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20  e if an old.    
1c9e0 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20    ** client has 
1c9f0 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  been writing the
1ca00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
1ca10 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20   update it now. 
1ca20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  Doing.      ** t
1ca30 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  his sooner rathe
1ca40 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61  r than later mea
1ca50 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
1ca60 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20  size can safely 
1ca70 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61  .      ** re-rea
1ca80 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
1ca90 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20  ize from page 1 
1caa0 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f  if a savepoint o
1cab0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  r transaction.  
1cac0 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
1cad0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
1cae0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
1caf0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1cb00 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65  ( pBt->nPage!=ge
1cb10 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1cb20 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20  aData[28]) ){.  
1cb30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1cb40 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
1cb50 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1cb60 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1cb70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cb80 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1cb90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1cba0 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
1cbb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cbc0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72  }.    }.  }...tr
1cbd0 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28  ans_begun:.  if(
1cbe0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1cbf0 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
1cc00 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
1cc10 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
1cc20 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
1cc30 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
1cc40 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76  .    ** open sav
1cc50 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
1cc60 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1cc70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1cc80 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68   0 and.    ** th
1cc90 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
1cca0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
1ccb0 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
1ccc0 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
1ccd0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1cce0 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
1ccf0 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
1cd00 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53  Pager, p->db->nS
1cd10 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a  avepoint);.  }..
1cd20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1cd30 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1cd40 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1cd50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1cd60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1cd70 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a  _AUTOVACUUM../*.
1cd80 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  ** Set the point
1cd90 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
1cda0 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  or all children 
1cdb0 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41  of page pPage. A
1cdc0 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65  lso, if.** pPage
1cdd0 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20   contains cells 
1cde0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1cdf0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65  erflow pages, se
1ce00 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  t the pointer.**
1ce10 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
1ce20 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1ce30 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  ges as well..*/.
1ce40 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68  static int setCh
1ce50 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61  ildPtrmaps(MemPa
1ce60 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
1ce70 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce90 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69   /* Counter vari
1cea0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
1ceb0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
1cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ced0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
1cee0 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f  in page pPage */
1cef0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf10 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1cf20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  code */.  BtShar
1cf30 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
1cf40 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
1cf50 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
1cf60 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1cf70 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1cf80 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
1cf90 29 20 29 3b 0a 20 20 72 63 20 3d 20 70 50 61 67  ) );.  rc = pPag
1cfa0 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49  e->isInit ? SQLI
1cfb0 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69  TE_OK : btreeIni
1cfc0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
1cfd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1cfe0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1cff0 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1d000 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
1d010 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
1d020 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
1d030 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1d040 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61  , i);..    ptrma
1d050 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
1d060 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a  e, pCell, &rc);.
1d070 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
1d080 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
1d090 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
1d0a0 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
1d0b0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1d0c0 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
1d0d0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
1d0e0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  gno, &rc);.    }
1d0f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
1d100 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1d110 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
1d120 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1d130 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1d140 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1d150 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1d160 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
1d170 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
1d180 26 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  &rc);.  }..  ret
1d190 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d1a0 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50   Somewhere on pP
1d1b0 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  age is a pointer
1d1c0 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
1d1d0 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
1d1e0 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20  nter so.** that 
1d1f0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f  it points to iTo
1d200 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
1d210 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
1d220 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
1d230 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65  to.** be modifie
1d240 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a  d, as  follows:.
1d250 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
1d260 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
1d270 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
1d280 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
1d290 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2b0 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
1d2c0 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1d2d0 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
1d2e0 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
1d2f0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1d300 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
1d310 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
1d320 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
1d330 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
1d340 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
1d350 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
1d360 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
1d370 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
1d380 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
1d390 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
1d3a0 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
1d3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
1d3c0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1d3d0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
1d3e0 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
1d3f0 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
1d400 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
1d410 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
1d420 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
1d430 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1d440 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1d450 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1d460 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
1d470 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
1d480 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
1d490 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
1d4a0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
1d4b0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
1d4c0 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
1d4d0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
1d4e0 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
1d4f0 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
1d500 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
1d510 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
1d520 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
1d530 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1d540 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
1d550 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
1d560 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1d570 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
1d580 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1d590 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  int nCell;.    i
1d5a0 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d  nt rc;..    rc =
1d5b0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f   pPage->isInit ?
1d5c0 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72   SQLITE_OK : btr
1d5d0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
1d5e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1d5f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e  return rc;.    n
1d600 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
1d610 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ell;..    for(i=
1d620 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
1d630 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
1d640 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1d650 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ge, i);.      if
1d660 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1d670 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20  OVERFLOW1 ){.   
1d680 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
1d690 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  fo;.        pPag
1d6a0 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
1d6b0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
1d6c0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
1d6d0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
1d6e0 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
1d6f0 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
1d700 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50  +info.nSize > pP
1d710 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
1d720 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
1d730 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1d740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1d750 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
1d760 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
1d770 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46            if( iF
1d780 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 70 43  rom==get4byte(pC
1d790 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell+info.nSize-4
1d7a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1d7b0 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2b   put4byte(pCell+
1d7c0 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69 54  info.nSize-4, iT
1d7d0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  o);.            
1d7e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
1d7f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1d800 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d810 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
1d820 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
1d830 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1d840 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
1d850 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1d860 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d870 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1d880 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
1d890 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
1d8a0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1d8b0 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
1d8c0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1d8d0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1d8e0 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
1d8f0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1d900 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1d910 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
1d920 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
1d930 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1d940 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1d950 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
1d960 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1d970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
1d980 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
1d990 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
1d9a0 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
1d9b0 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
1d9c0 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
1d9d0 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
1d9e0 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
1d9f0 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54  s valid..**.** T
1da00 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  he isCommit flag
1da10 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1da20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
1da30 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
1da40 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t.** the journal
1da50 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
1da60 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
1da70 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1da80 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e  ge->pgno .** can
1da90 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
1daa0 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
1dab0 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
1dac0 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
1dad0 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f  that.** page..*/
1dae0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f  .static int relo
1daf0 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68  catePage(.  BtSh
1db00 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
1db10 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f       /* Btree */
1db20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50  .  MemPage *pDbP
1db30 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  age,        /* O
1db40 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  pen page to move
1db50 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
1db60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1db70 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74  * Pointer map 't
1db80 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70  ype' entry for p
1db90 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1dba0 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20   iPtrPage,      
1dbb0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1dbc0 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e  map 'page-no' en
1dbd0 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
1dbe0 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50  */.  Pgno iFreeP
1dbf0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
1dc00 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f   The location to
1dc10 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f   move pDbPage to
1dc20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
1dc30 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  it             /
1dc40 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  * isCommit flag 
1dc50 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
1dc60 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a  3PagerMovepage *
1dc70 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
1dc80 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
1dc90 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
1dca0 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
1dcb0 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
1dcc0 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
1dcd0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
1dce0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1dcf0 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
1dd00 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1dd10 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1dd20 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
1dd30 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1dd40 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
1dd50 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
1dd60 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
1dd70 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
1dd80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1dd90 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1dda0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1ddb0 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70  sert( pDbPage->p
1ddc0 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a  Bt==pBt );..  /*
1ddd0 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
1dde0 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
1ddf0 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
1de00 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
1de10 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
1de20 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
1de30 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
1de40 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
1de50 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
1de60 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
1de70 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
1de80 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
1de90 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1dea0 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
1deb0 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
1dec0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
1ded0 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  , isCommit);.  i
1dee0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1def0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1df00 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65  c;.  }.  pDbPage
1df10 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61  ->pgno = iFreePa
1df20 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62  ge;..  /* If pDb
1df30 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65  Page was a btree
1df40 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d  -page, then it m
1df50 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61  ay have child pa
1df60 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73  ges and/or cells
1df70 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74  .  ** that point
1df80 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
1df90 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  es. The pointer 
1dfa0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1dfb0 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70  all these.  ** p
1dfc0 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
1dfd0 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20  changed..  **.  
1dfe0 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73  ** If pDbPage is
1dff0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1e000 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
1e010 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74  t 4 bytes may st
1e020 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74  ore a.  ** point
1e030 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65  er to a subseque
1e040 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1e050 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
1e060 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a   case, then.  **
1e070 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
1e080 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
1e090 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62  ated for the sub
1e0a0 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
1e0b0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
1e0c0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1e0d0 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
1e0e0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1e0f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
1e100 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50  hildPtrmaps(pDbP
1e110 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1e120 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e130 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e140 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1e150 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c     Pgno nextOvfl
1e160 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50   = get4byte(pDbP
1e170 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
1e180 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30   if( nextOvfl!=0
1e190 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
1e1a0 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
1e1b0 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
1e1c0 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20  OW2, iFreePage, 
1e1d0 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
1e1e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e1f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1e200 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1e210 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20  }.  }..  /* Fix 
1e220 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69  the database poi
1e230 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74  nter on page iPt
1e240 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74  rPage that point
1e250 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f  ed at iDbPage so
1e260 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  .  ** that it po
1e270 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67  ints at iFreePag
1e280 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20  e. Also fix the 
1e290 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
1e2a0 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50  y for.  ** iPtrP
1e2b0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1e2c0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
1e2d0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
1e2e0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
1e2f0 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
1e300 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
1e310 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e320 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1e330 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1e340 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e350 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
1e360 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
1e370 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e380 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
1e390 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
1e3a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e3b0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
1e3c0 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
1e3d0 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
1e3e0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1e3f0 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
1e400 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
1e410 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1e420 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e430 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1e440 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
1e450 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
1e460 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
1e470 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e480 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
1e490 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
1e4a0 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
1e4b0 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
1e4c0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
1e4d0 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
1e4e0 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
1e4f0 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
1e500 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
1e510 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
1e520 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
1e530 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
1e540 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  sful, return.** 
1e550 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
1e560 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
1e570 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
1e580 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20  ore no point in 
1e590 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  .** calling this
1e5a0 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
1e5b0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1e5c0 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20  DONE. Or, if an 
1e5d0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
1e5e0 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74  , return some ot
1e5f0 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  her error code..
1e600 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
1e610 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75  fically, this fu
1e620 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
1e630 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74  to re-organize t
1e640 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a  he database so .
1e650 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  ** that the last
1e660 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
1e670 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
1e680 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  se is no longer 
1e690 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  in use..**.** Pa
1e6a0 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20  rameter nFin is 
1e6b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1e6c0 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61  ges that this da
1e6d0 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e  tabase would con
1e6e0 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69  tain.** were thi
1e6f0 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  s function calle
1e700 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  d until it retur
1e710 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  ns SQLITE_DONE..
1e720 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f  **.** If the bCo
1e730 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69  mmit parameter i
1e740 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73  s non-zero, this
1e750 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
1e760 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63  s that the .** c
1e770 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
1e780 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
1e790 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69  umStep() until i
1e7a0 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1e7b0 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20  _DONE .** or an 
1e7c0 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69  error. bCommit i
1e7d0 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f  s passed true fo
1e7e0 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
1e7f0 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f  -on-commit .** o
1e800 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c  peration, or fal
1e810 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d  se for an increm
1e820 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f  ental vacuum..*/
1e830 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
1e840 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
1e850 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
1e860 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
1e870 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  g, int bCommit){
1e880 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
1e890 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
1e8a0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1e8b0 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
1e8c0 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e-list */.  int 
1e8d0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
1e8e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1e8f0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1e900 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
1e910 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
1e920 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
1e930 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
1e940 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
1e950 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1e960 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70  ) ){.    u8 eTyp
1e970 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
1e980 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
1e990 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
1e9a0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1e9b0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
1e9c0 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  ( nFreeList==0 )
1e9d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1e9e0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1e9f0 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  }..    rc = ptrm
1ea00 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74  apGet(pBt, iLast
1ea10 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  Pg, &eType, &iPt
1ea20 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1ea30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ea40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ea50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ea60 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1ea70 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
1ea80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1ea90 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1eaa0 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
1eab0 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
1eac0 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  E ){.      if( b
1ead0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1eae0 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
1eaf0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1eb00 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
1eb10 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
1eb20 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
1eb30 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * if bCommit is 
1eb40 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
1eb50 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
1eb60 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
1eb70 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
1eb80 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
1eb90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1eba0 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
1ebb0 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
1ebc0 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
1ebd0 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
1ebe0 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
1ebf0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
1ec00 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
1ec10 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
1ec20 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
1ec30 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
1ec40 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
1ec50 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
1ec60 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
1ec70 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a  BTALLOC_EXACT);.
1ec80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1ec90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1eca0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1ecb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ecc0 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
1ecd0 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
1ece0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1ecf0 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
1ed00 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
1ed10 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
1ed20 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
1ed30 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
1ed40 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
1ed50 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
1ed60 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
1ed70 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20  astPg;.      u8 
1ed80 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
1ed90 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70  ANY;   /* Mode p
1eda0 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
1edb0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
1edc0 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69   */.      Pgno i
1edd0 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Near = 0;       
1ede0 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61      /* nearby pa
1edf0 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
1ee00 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
1ee10 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62  */..      rc = b
1ee20 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1ee30 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
1ee40 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
1ee50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ee60 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1ee70 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
1ee80 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d       /* If bComm
1ee90 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  it is zero, this
1eea0 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
1eeb0 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
1eec0 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
1eed0 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
1eee0 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
1eef0 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
1ef00 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
1ef10 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1ef20 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
1ef30 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20  and, if bCommit 
1ef40 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1ef50 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a  zero, then keep.
1ef60 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67        ** looping
1ef70 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61   until a free-pa
1ef80 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69  ge located withi
1ef90 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e  n the first nFin
1efa0 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
1efb0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66  of the file is f
1efc0 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ound..      */. 
1efd0 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1efe0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
1eff0 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c  Mode = BTALLOC_L
1f000 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72  E;.        iNear
1f010 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d   = nFin;.      }
1f020 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
1f030 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
1f040 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
1f050 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1f060 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
1f070 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e  Pg, &iFreePg, iN
1f080 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ear, eMode);.   
1f090 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f0a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f0b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1f0c0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
1f0d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f0e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f0f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
1f100 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
1f110 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20  ile( bCommit && 
1f120 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
1f130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1f140 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
1f150 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
1f160 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
1f170 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
1f180 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
1f190 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29  FreePg, bCommit)
1f1a0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
1f1b0 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
1f1c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f1d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f1e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f1f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1f200 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1f210 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  ){.    do {.    
1f220 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
1f230 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67   }while( iLastPg
1f240 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1f250 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d  AGE(pBt) || PTRM
1f260 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1f270 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70  LastPg) );.    p
1f280 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1f290 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50  = 1;.    pBt->nP
1f2a0 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20  age = iLastPg;. 
1f2b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1f2c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1f2d0 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  The database ope
1f2e0 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
1f2f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
1f300 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1f310 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61  base.** nOrig pa
1f320 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74  ges in size cont
1f330 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65  aining nFree fre
1f340 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  e pages. Return 
1f350 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
1f360 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1f370 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66  abase in pages f
1f380 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f  ollowing an auto
1f390 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f  -vacuum operatio
1f3a0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  n..*/.static Pgn
1f3b0 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74  o finalDbSize(Bt
1f3c0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
1f3d0 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46  o nOrig, Pgno nF
1f3e0 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74  ree){.  int nEnt
1f3f0 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
1f400 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f410 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
1f420 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20  one ptrmap page 
1f430 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61  */.  Pgno nPtrma
1f440 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1f450 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1f460 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74  f PtrMap pages t
1f470 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
1f480 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4a0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
1f4b0 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70  */..  nEntry = p
1f4c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
1f4d0 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e  ;.  nPtrmap = (n
1f4e0 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
1f4f0 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
1f500 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e  rig)+nEntry)/nEn
1f510 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f  try;.  nFin = nO
1f520 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
1f530 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72  trmap;.  if( nOr
1f540 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
1f550 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
1f560 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  n<PENDING_BYTE_P
1f570 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1f580 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68  nFin--;.  }.  wh
1f590 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
1f5a0 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c  GE(pBt, nFin) ||
1f5b0 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   nFin==PENDING_B
1f5c0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1f5d0 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
1f5e0 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b  ..  return nFin;
1f5f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74  .}../*.** A writ
1f600 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
1f610 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66  st be opened bef
1f620 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
1f630 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
1f640 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67   performs a sing
1f650 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20  le unit of work 
1f660 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65  towards an incre
1f670 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
1f680 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72  *.** If the incr
1f690 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69  emental vacuum i
1f6a0 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72  s finished after
1f6b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
1f6c0 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54  as run,.** SQLIT
1f6d0 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
1f6e0 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
1f6f0 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e   finished, but n
1f700 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  o error occurred
1f710 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
1f720 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1f730 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
1f740 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
1f750 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1f760 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
1f770 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1f780 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1f790 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
1f7a0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1f7b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1f7c0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1f7d0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
1f7e0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1f7f0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
1f800 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
1f810 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
1f820 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
1f830 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72  se{.    Pgno nOr
1f840 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
1f850 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67  unt(pBt);.    Pg
1f860 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  no nFree = get4b
1f870 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1f880 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1f890 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69    Pgno nFin = fi
1f8a0 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
1f8b0 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20  Orig, nFree);.. 
1f8c0 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69     if( nOrig<nFi
1f8d0 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
1f8e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1f8f0 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  KPT;.    }else i
1f900 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  f( nFree>0 ){.  
1f910 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
1f920 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
1f930 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1f940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f950 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
1f960 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1f970 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
1f980 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1f990 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e  tep(pBt, nFin, n
1f9a0 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  Orig, 0);.      
1f9b0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1f9c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f9d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f9e0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
1f9f0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
1fa00 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
1fa10 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1fa20 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
1fa30 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
1fa40 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1fa50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1fa60 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ONE;.    }.  }. 
1fa70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1fa80 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1fa90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1faa0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1fab0 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
1fac0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
1fad0 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
1fae0 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74  on.** is committ
1faf0 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
1fb00 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
1fb10 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
1fb20 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
1fb30 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
1fb40 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
1fb50 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
1fb60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fb70 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
1fb80 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
1fb90 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
1fba0 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
1fbb0 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
1fbc0 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
1fbd0 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
1fbe0 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
1fbf0 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
1fc00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1fc10 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
1fc20 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
1fc30 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1fc40 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1fc50 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1fc60 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c  Pager;.  VVA_ONL
1fc70 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  Y( int nRef = sq
1fc80 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
1fc90 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a 0a 20  nt(pPager); ).. 
1fca0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1fcb0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1fcc0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
1fcd0 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
1fce0 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
1fcf0 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
1fd00 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
1fd10 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
1fd20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
1fd30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1fd40 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1fd50 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61  database after a
1fd60 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a  utovacuuming */.
1fd70 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20      Pgno nFree; 
1fd80 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1fd90 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
1fda0 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61   freelist initia
1fdb0 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  lly */.    Pgno 
1fdc0 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  iFree;        /*
1fdd0 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74   The next page t
1fde0 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
1fdf0 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
1fe00 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1fe10 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65   size before fre
1fe20 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72  eing */..    nOr
1fe30 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
1fe40 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66  unt(pBt);.    if
1fe50 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1fe60 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e  pBt, nOrig) || n
1fe70 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
1fe80 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1fe90 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
1fea0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
1feb0 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
1fec0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66   for which the f
1fed0 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20  inal page.      
1fee0 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70  ** is either a p
1fef0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
1ff00 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
1ff10 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65  yte page. If one
1ff20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63  .      ** is enc
1ff30 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69  ountered, this i
1ff40 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74  ndicates corrupt
1ff50 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1ff60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ff70 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1ff80 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65      }..    nFree
1ff90 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
1ffa0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1ffb0 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  36]);.    nFin =
1ffc0 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
1ffd0 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
1ffe0 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f  .    if( nFin>nO
1fff0 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rig ) return SQL
20000 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20010 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e  ;.    if( nFin<n
20020 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
20030 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
20040 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
20050 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65    }.    for(iFre
20060 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e  e=nOrig; iFree>n
20070 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Fin && rc==SQLIT
20080 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a  E_OK; iFree--){.
20090 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
200a0 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
200b0 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a  Fin, iFree, 1);.
200c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
200d0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c  c==SQLITE_DONE |
200e0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc==SQLITE_OK)
200f0 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20   && nFree>0 ){. 
20100 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20110 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
20120 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
20130 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
20140 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
20150 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20  aData[32], 0);. 
20160 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
20170 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
20180 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[36], 0);.     
20190 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
201a0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
201b0 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20  ], nFin);.      
201c0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
201d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d   = 1;.      pBt-
201e0 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20  >nPage = nFin;. 
201f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
20200 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20210 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
20220 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
20230 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
20240 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c  ssert( nRef>=sql
20250 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
20260 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  t(pPager) );.  r
20270 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
20280 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  se /* ifndef SQL
20290 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
202a0 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  UUM */.# define 
202b0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
202c0 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  x) SQLITE_OK.#en
202d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
202e0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
202f0 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20   first phase of 
20300 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d  a two-phase comm
20310 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
20320 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f  e.** causes a ro
20330 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
20340 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66  o be created (if
20350 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
20360 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61  eady exist).** a
20370 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
20380 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61  h enough informa
20390 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20  tion so that if 
203a0 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63  a power loss occ
203b0 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  urs.** the datab
203c0 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f  ase can be resto
203d0 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
203e0 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61  nal state by pla
203f0 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65  ying back.** the
20400 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20   journal.  Then 
20410 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
20420 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  the journal are 
20430 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a  flushed out to.*
20440 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74  * the disk.  Aft
20450 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
20460 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64  s safely on oxid
20470 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  e, the changes t
20480 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  o the.** databas
20490 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  e are written in
204a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
204b0 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64  file and flushed
204c0 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74   to oxide..** At
204d0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73   the end of this
204e0 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62   call, the rollb
204f0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c  ack journal stil
20500 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a  l exists on the.
20510 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61  ** disk and we a
20520 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  re still holding
20530 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74   all locks, so t
20540 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
20550 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74  as not.** commit
20560 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65  ted.  See sqlite
20570 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
20580 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73  eTwo() for the s
20590 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74  econd phase of t
205a0 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f  he.** commit pro
205b0 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cess..**.** This
205c0 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
205d0 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   if no write-tra
205e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nsaction is curr
205f0 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20  ently active on 
20600 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  pBt..**.** Other
20610 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64  wise, sync the d
20620 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
20630 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20   the btree pBt. 
20640 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
20650 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  o.** the name of
20660 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
20670 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
20680 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
20690 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  to the.** indivi
206a0 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
206b0 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69  e, or is NULL, i
206c0 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73  ndicating no mas
206d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
206e0 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74   .** (single dat
206f0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
20700 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  n)..**.** When t
20710 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  his is called, t
20720 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
20730 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  l should already
20740 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72   have been.** cr
20750 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64  eated, populated
20760 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e   with this journ
20770 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73  al pointer and s
20780 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
20790 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69  *.** Once this i
207a0 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65  s routine has re
207b0 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79  turned, the only
207c0 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20   thing required 
207d0 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65  to commit.** the
207e0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
207f0 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  on for this data
20800 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20  base file is to 
20810 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
20820 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
20830 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
20840 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20  seOne(Btree *p, 
20850 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
20860 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
20870 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
20880 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
20890 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
208a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
208b0 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c   p->pBt;.    sql
208c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
208d0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
208e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
208f0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
20900 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
20910 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75     rc = autoVacu
20920 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20  umCommit(pBt);. 
20930 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20940 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20950 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
20960 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
20970 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
20980 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
20990 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
209a0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
209b0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
209c0 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
209d0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
209e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
209f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20a00 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
20a10 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
20a20 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  ster, 0);.    sq
20a30 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
20a40 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
20a50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
20a60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
20a70 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20  alled from both 
20a80 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
20a90 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52  Two() and BtreeR
20aa0 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20  ollback().** at 
20ab0 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
20ac0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  f a transaction.
20ad0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
20ae0 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
20af0 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ion(Btree *p){. 
20b00 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
20b10 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
20b20 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
20b30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20b40 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
20b50 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  (p) );..#ifndef 
20b60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
20b70 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44  VACUUM.  pBt->bD
20b80 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23  oTruncate = 0;.#
20b90 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69  endif.  if( p->i
20ba0 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
20bb0 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65  E && db->nVdbeRe
20bc0 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ad>1 ){.    /* I
20bd0 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  f there are othe
20be0 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  r active stateme
20bf0 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  nts that belong 
20c00 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
20c10 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20  .    ** handle, 
20c20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72  downgrade to a r
20c30 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
20c40 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20  tion. The other 
20c50 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a  statements.    *
20c60 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  * may still be r
20c70 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
20c80 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20  database.  */.  
20c90 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68    downgradeAllSh
20ca0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
20cb0 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69  cks(p);.    p->i
20cc0 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52  nTrans = TRANS_R
20cd0 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
20ce0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
20cf0 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20  le had any kind 
20d00 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
20d10 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
20d20 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  he .    ** trans
20d30 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20  action count of 
20d40 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
20d50 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
20d60 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20  tion count .    
20d70 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  ** reaches 0, se
20d80 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
20d90 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
20da0 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
20db0 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20  eIfUnused().    
20dc0 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69  ** call below wi
20dd0 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  ll unlock the pa
20de0 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ger.  */.    if(
20df0 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
20e00 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
20e10 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
20e20 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
20e30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  );.      pBt->nT
20e40 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
20e50 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
20e60 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
20e70 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54          pBt->inT
20e80 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
20e90 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  NS_NONE;.      }
20ea0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
20eb0 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  et the current t
20ec0 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
20ed0 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
20ee0 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20  nd unlock the . 
20ef0 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74     ** pager if t
20f00 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20  his call closed 
20f10 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72  the only read or
20f20 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
20f30 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69  on.  */.    p->i
20f40 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
20f50 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ONE;.    unlockB
20f60 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
20f70 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
20f80 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a  ntegrity(p);.}..
20f90 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
20fa0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
20fb0 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
20fc0 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
20fd0 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
20fe0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
20ff0 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
21000 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
21010 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
21020 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75  itPhaseOne() rou
21030 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
21040 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68  rst phase and sh
21050 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  ould.** be invok
21060 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ed prior to call
21070 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
21080 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  .  The sqlite3Bt
21090 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
210a0 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  e().** routine d
210b0 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20  id all the work 
210c0 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72  of writing infor
210d0 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69  mation out to di
210e0 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20  sk and flushing 
210f0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
21100 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65  so that they are
21110 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68   written onto th
21120 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20  e disk platter. 
21130 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75   All this.** rou
21140 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69  tine has to do i
21150 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e  s delete or trun
21160 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
21170 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a   header in the.*
21180 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
21190 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61  ournal (which ca
211a0 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
211b0 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
211c0 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b  and.** drop lock
211d0 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  s..**.** Normall
211e0 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  y, if an error o
211f0 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
21200 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20 61  pager layer is a
21210 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a  ttempting to .**
21220 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e   finalize the un
21230 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  derlying journal
21240 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63   file, this func
21250 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
21260 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65  error and.** the
21270 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
21280 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c  l attempt a roll
21290 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  back. However, i
212a0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
212b0 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d  ument.** is non-
212c0 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62  zero then this b
212d0 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f  -tree transactio
212e0 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d  n is part of a m
212f0 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72  ulti-file .** tr
21300 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
21310 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72 61  is case, the tra
21320 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
21330 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74  eady been commit
21340 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65  ted .** (by dele
21350 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ting a master jo
21360 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
21370 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
21380 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  ignore this .** 
21390 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
213a0 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20   code. So, even 
213b0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
213c0 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  rs in the pager 
213d0 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20  layer,.** reset 
213e0 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
213f0 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  ts internal stat
21400 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  e to indicate th
21410 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20  at the write.** 
21420 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
21430 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69  been closed. Thi
21440 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65 2c  s is quite safe,
21450 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77 69   as the pager wi
21460 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73  ll have.** trans
21470 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65  itioned to the e
21480 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  rror state..**.*
21490 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
214a0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
214b0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
214c0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
214d0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
214e0 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
214f0 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
21500 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
21510 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
21520 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
21530 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c  tree *p, int bCl
21540 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70  eanup){..  if( p
21550 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
21560 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53  _NONE ) return S
21570 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
21580 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
21590 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
215a0 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
215b0 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
215c0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
215d0 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20  on open, commit 
215e0 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
215f0 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  s .  ** transact
21600 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20  ion and set the 
21610 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
21620 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f  TRANS_READ..  */
21630 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
21640 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
21650 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
21660 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
21670 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
21680 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
21690 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
216a0 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
216b0 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
216c0 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
216d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
216e0 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
216f0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
21700 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21710 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d  _OK && bCleanup=
21720 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
21730 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
21740 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
21750 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  c;.    }.    p->
21760 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20  iDataVersion--; 
21770 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66   /* Compensate f
21780 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  or pPager->iData
21790 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20  Version++; */.  
217a0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
217b0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
217c0 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61  D;.    btreeClea
217d0 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
217e0 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
217f0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
21800 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
21810 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
21820 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21830 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68  /*.** Do both ph
21840 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74  ases of a commit
21850 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21860 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65  BtreeCommit(Btre
21870 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
21880 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
21890 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
218a0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
218b0 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29  itPhaseOne(p, 0)
218c0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
218d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
218e0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
218f0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20  mmitPhaseTwo(p, 
21900 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
21910 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
21920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21930 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
21940 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ne sets the stat
21950 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  e to CURSOR_FAUL
21960 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a  T and the error.
21970 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f  ** code to errCo
21980 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72  de for every cur
21990 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61  sor on any BtSha
219a0 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a  red that pBtree.
219b0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  ** references.  
219c0 4f 72 20 69 66 20 74 68 65 20 77 72 69 74 65 4f  Or if the writeO
219d0 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74 20  nly flag is set 
219e0 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a  to 1, then only.
219f0 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20 63 75  ** trip write cu
21a00 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20  rsors and leave 
21a10 72 65 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63  read cursors unc
21a20 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76  hanged..**.** Ev
21a30 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 61 20  ery cursor is a 
21a40 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20  candidate to be 
21a50 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69  tripped, includi
21a60 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68  ng cursors.** th
21a70 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68  at belong to oth
21a80 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
21a90 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70  ections that hap
21aa0 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61  pen to be.** sha
21ab0 72 69 6e 67 20 74 68 65 20 63 61 63 68 65 20 77  ring the cache w
21ac0 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a  ith pBtree..**.*
21ad0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
21ae0 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20  ets called when 
21af0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
21b00 73 2e 20 49 66 20 74 68 65 20 77 72 69 74 65 4f  s. If the writeO
21b10 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  nly.** flag is t
21b20 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77  rue, then only w
21b30 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65  rite-cursors nee
21b40 64 20 62 65 20 74 72 69 70 70 65 64 20 2d 20 72  d be tripped - r
21b50 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73  ead-only.** curs
21b60 6f 72 73 20 73 61 76 65 20 74 68 65 69 72 20 63  ors save their c
21b70 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73  urrent positions
21b80 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61   so that they ma
21b90 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66  y continue .** f
21ba0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c  ollowing the rol
21bb0 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72  lback. Or, if wr
21bc0 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
21bd0 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  , all cursors ar
21be0 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49  e .** tripped. I
21bf0 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65  n general, write
21c00 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66  Only is false if
21c10 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
21c20 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64   being.** rolled
21c30 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74   back modified t
21c40 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
21c50 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ma. In this case
21c60 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20   b-tree root.** 
21c70 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76  pages may be mov
21c80 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72  ed or deleted fr
21c90 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
21ca0 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69  altogether, maki
21cb0 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20  ng.** it unsafe 
21cc0 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72 73  for read cursors
21cd0 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a   to continue..**
21ce0 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69 74 65  .** If the write
21cf0 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75  Only flag is tru
21d00 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69  e and an error i
21d10 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
21d20 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74  ile .** saving t
21d30 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74  he current posit
21d40 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e  ion of a read-on
21d50 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63  ly cursor, all c
21d60 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c  ursors, .** incl
21d70 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63  uding all read-c
21d80 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70  ursors are tripp
21d90 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ed..**.** SQLITE
21da0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
21db0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
21dc0 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
21dd0 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61  curs while.** sa
21de0 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f  ving a cursor po
21df0 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74  sition, an SQLit
21e00 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
21e10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
21e20 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
21e30 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69  Btree *pBtree, i
21e40 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20  nt errCode, int 
21e50 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74  writeOnly){.  Bt
21e60 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74  Cursor *p;.  int
21e70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21e80 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 72 69  ..  assert( (wri
21e90 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69  teOnly==0 || wri
21ea0 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54  teOnly==1) && BT
21eb0 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20  CF_WriteFlag==1 
21ec0 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  );.  if( pBtree 
21ed0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
21ee0 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
21ef0 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72  ;.    for(p=pBtr
21f00 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
21f10 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
21f20 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74  {.      if( writ
21f30 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72  eOnly && (p->cur
21f40 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
21f50 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20  teFlag)==0 ){.  
21f60 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
21f70 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
21f80 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
21f90 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
21fa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
21fb0 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
21fc0 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20  tion(p);.       
21fd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21fe0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21ff0 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
22000 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
22010 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c  sors(pBtree, rc,
22020 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
22030 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
22040 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
22050 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22060 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
22070 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20  learCursor(p);. 
22080 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
22090 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
220a0 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70  .        p->skip
220b0 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
220c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 74        }.      bt
220d0 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
220e0 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20  sorPages(p);.   
220f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
22100 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
22110 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
22120 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
22130 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
22140 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
22150 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43  ..**.** If tripC
22160 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54  ode is not SQLIT
22170 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72  E_OK then cursor
22180 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69  s will be invali
22190 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29 2e  dated (tripped).
221a0 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
221b0 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70  ursors are tripp
221c0 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
221d0 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20  is true but all 
221e0 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74  cursors are.** t
221f0 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f  ripped if writeO
22200 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41  nly is false.  A
22210 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
22220 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63  e.** a tripped c
22230 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c  ursor will resul
22240 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t in an error..*
22250 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
22260 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
22270 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
22280 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
22290 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
222a0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
222b0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
222c0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
222d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
222e0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
222f0 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f  e *p, int tripCo
22300 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c  de, int writeOnl
22310 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  y){.  int rc;.  
22320 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
22330 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
22340 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73  e *pPage1;..  as
22350 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d  sert( writeOnly=
22360 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d  =1 || writeOnly=
22370 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
22380 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
22390 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20  _ABORT_ROLLBACK 
223a0 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  || tripCode==SQL
223b0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69  ITE_OK );.  sqli
223c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
223d0 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  ;.  if( tripCode
223e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
223f0 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65     rc = tripCode
22400 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
22410 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
22420 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74 65    if( rc ) write
22430 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Only = 0;.  }els
22440 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
22450 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
22460 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20   tripCode ){.   
22470 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74   int rc2 = sqlit
22480 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
22490 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64  rsors(p, tripCod
224a0 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20  e, writeOnly);. 
224b0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
224c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69  QLITE_OK || (wri
224d0 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32  teOnly==0 && rc2
224e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a  ==SQLITE_OK) );.
224f0 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
22500 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
22510 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e  2;.  }.  btreeIn
22520 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
22530 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
22540 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
22550 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
22560 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
22570 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
22580 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
22590 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
225a0 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
225b0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
225c0 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
225d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
225e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
225f0 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
22600 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
22610 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
22620 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
22630 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65   ** call btreeGe
22640 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
22650 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
22660 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
22670 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
22680 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
22690 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50     if( btreeGetP
226a0 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
226b0 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
226c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
226d0 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
226e0 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
226f0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74  >aData);.      t
22700 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d  estcase( nPage==
22710 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
22720 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65  Page==0 ) sqlite
22730 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
22740 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
22750 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  age);.      test
22760 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65  case( pBt->nPage
22770 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20  !=nPage );.     
22780 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
22790 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  age;.      relea
227a0 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31  sePageOne(pPage1
227b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
227c0 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
227d0 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d  ursors(pBt, 1)==
227e0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
227f0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
22800 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
22810 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
22820 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
22830 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
22840 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
22850 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
22860 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22870 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74  /*.** Start a st
22880 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
22890 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
228a0 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62  ransaction can b
228b0 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
228c0 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
228d0 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
228e0 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74  action. You must
228f0 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
22900 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20  tion .** before 
22910 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
22920 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
22930 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
22940 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
22950 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20  ally .** if the 
22960 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
22970 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
22980 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74  s back..**.** St
22990 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
229a0 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64  actions are used
229b0 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75   around individu
229c0 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
229d0 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f  s.** that are co
229e0 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
229f0 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20   BEGIN...COMMIT 
22a00 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e  block.  If a con
22a10 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72  straint.** error
22a20 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
22a30 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
22a40 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74  e effect of that
22a50 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   one statement.*
22a60 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
22a70 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
22a80 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
22a90 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
22aa0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
22ab0 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72  statement sub-tr
22ac0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70  ansaction is imp
22ad0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61  lemented as an a
22ae0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
22af0 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65  nt. The.** value
22b00 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
22b10 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
22b20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
22b30 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
22b40 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  s,.** including 
22b50 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75  the new anonymou
22b60 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65  s savepoint, ope
22b70 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e  n on the B-Tree.
22b80 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a   i.e. if there.*
22b90 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
22ba0 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e  savepoints and n
22bb0 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  o other statemen
22bc0 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  t-transactions o
22bd0 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65  pen,.** iStateme
22be0 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e  nt is 1. This an
22bf0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
22c00 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
22c10 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
22c20 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71  .** using the sq
22c30 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
22c40 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  int() function..
22c50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22c60 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
22c70 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74  ee *p, int iStat
22c80 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  ement){.  int rc
22c90 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
22ca0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
22cb0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
22cc0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
22cd0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
22ce0 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
22cf0 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
22d00 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
22d10 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Y)==0 );.  asser
22d20 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20  t( iStatement>0 
22d30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
22d40 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e  atement>p->db->n
22d50 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61  Savepoint );.  a
22d60 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
22d70 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
22d80 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41  _WRITE );.  /* A
22d90 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65  t the pager leve
22da0 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  l, a statement t
22db0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20  ransaction is a 
22dc0 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20  savepoint with. 
22dd0 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65   ** an index gre
22de0 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ater than all sa
22df0 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64  vepoints created
22e00 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e   explicitly usin
22e10 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  g.  ** SQL state
22e20 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c  ments. It is ill
22e30 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65  egal to open, re
22e40 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
22e50 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  k any.  ** such 
22e60 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
22e70 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
22e80 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
22e90 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
22ea0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
22eb0 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
22ec0 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
22ed0 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a  r, iStatement);.
22ee0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
22ef0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
22f00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
22f10 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
22f20 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
22f30 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79  on, op, is alway
22f40 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
22f50 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50  BACK.** or SAVEP
22f60 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68  OINT_RELEASE. Th
22f70 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68  is function eith
22f80 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72  er releases or r
22f90 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a  olls back the.**
22fa0 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74   savepoint ident
22fb0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
22fc0 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64  er iSavepoint, d
22fd0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
22fe0 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e  value .** of op.
22ff0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
23000 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67   iSavepoint is g
23010 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
23020 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f  qual to zero. Ho
23030 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a  wever, if op is.
23040 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ** SAVEPOINT_ROL
23050 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76  LBACK, then iSav
23060 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20  epoint may also 
23070 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63  be -1. In this c
23080 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  ase the .** cont
23090 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69  ents of the enti
230a0 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  re transaction a
230b0 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  re rolled back. 
230c0 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
230d0 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d  t.** from a norm
230e0 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  al transaction r
230f0 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c  ollback, as no l
23100 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65  ocks are release
23110 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61  d and the.** tra
23120 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73  nsaction remains
23130 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   open..*/.int sq
23140 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
23150 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  int(Btree *p, in
23160 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70  t op, int iSavep
23170 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
23180 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
23190 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61  f( p && p->inTra
231a0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
231b0 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
231c0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
231d0 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53     assert( op==S
231e0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
231f0 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
23200 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
23210 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
23220 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76  oint>=0 || (iSav
23230 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70  epoint==-1 && op
23240 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
23250 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c  BACK) );.    sql
23260 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
23270 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  );.    if( op==S
23280 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
23290 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
232a0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
232b0 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Bt, 0, 0);.    }
232c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
232d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
232e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
232f0 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  rSavepoint(pBt->
23300 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76  pPager, op, iSav
23310 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
23320 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23330 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
23340 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26  ( iSavepoint<0 &
23350 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
23360 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59   & BTS_INITIALLY
23370 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20  _EMPTY)!=0 ){.  
23380 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
23390 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
233a0 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
233b0 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
233c0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65   pBt->nPage = ge
233d0 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d  t4byte(28 + pBt-
233e0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  >pPage1->aData);
233f0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ..      /* The d
23400 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73  atabase size was
23410 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
23420 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74  e offset 28 of t
23430 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20  he header.      
23440 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  ** when the tran
23450 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
23460 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   so we know that
23470 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66   the value at of
23480 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38  fset.      ** 28
23490 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a   is nonzero. */.
234a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
234b0 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20  t->nPage>0 );.  
234c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
234d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
234e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
234f0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
23500 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
23510 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
23520 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
23530 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49  age.** iTable. I
23540 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
23550 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
23560 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  d, it is assumed
23570 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c   that.** the cal
23580 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20  ler already has 
23590 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d  at least a read-
235a0 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
235b0 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20   open.** on the 
235c0 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79  database already
235d0 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72  . If a write-cur
235e0 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
235f0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
23600 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ller is assumed 
23610 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  to have an open 
23620 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
23630 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
23640 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20  BTREE_WRCSR bit 
23650 6f 66 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65  of wrFlag is cle
23660 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ar, then the cur
23670 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20  sor can only.** 
23680 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
23690 69 6e 67 2e 20 20 49 66 20 74 68 65 20 42 54 52  ing.  If the BTR
236a0 45 45 5f 57 52 43 53 52 20 62 69 74 20 69 73 20  EE_WRCSR bit is 
236b0 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  set, then the cu
236c0 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75  rsor.** can be u
236d0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
236e0 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69  or for writing i
236f0 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
23700 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a  ns for writing.*
23710 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  * are also met. 
23720 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63   These are the c
23730 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
23740 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
23750 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69  der.** for writi
23760 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64  ng to be allowed
23770 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
23780 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
23790 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
237a0 68 20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e  h wrFlag contain
237b0 69 6e 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a  ing BTREE_WRCSR.
237c0 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20  **.** 2:  Other 
237d0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
237e0 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20  ions that share 
237f0 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
23800 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20  ache.**     but 
23810 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e  which are not in
23820 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d   the READ_UNCOMM
23830 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20  ITTED state may 
23840 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  not have.**     
23850 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74  cursors open wit
23860 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74  h wrFlag==0 on t
23870 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20  he same table.  
23880 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20  Otherwise.**    
23890 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
238a0 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20  e by this write 
238b0 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20  cursor would be 
238c0 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  visible to.**   
238d0 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f    the read curso
238e0 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  rs in the other 
238f0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
23900 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54  ion..**.** 3:  T
23910 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
23920 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f   be writable (no
23930 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  t on read-only m
23940 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20  edia).**.** 4:  
23950 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
23960 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
23970 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  ion..**.** The B
23980 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62  TREE_FORDELETE b
23990 69 74 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79  it of wrFlag may
239a0 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73   optionally be s
239b0 65 74 20 69 66 20 42 54 52 45 45 5f 57 52 43 53  et if BTREE_WRCS
239c0 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66  R.** is set.  If
239d0 20 46 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65   FORDELETE is se
239e0 74 2c 20 74 68 61 74 20 69 73 20 61 20 68 69 6e  t, that is a hin
239f0 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65  t to the impleme
23a00 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  ntation that.** 
23a10 74 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c  this cursor will
23a20 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f   only be used to
23a30 20 73 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c   seek to and del
23a40 65 74 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61  ete entries of a
23a50 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61  n index.** as pa
23a60 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44  rt of a larger D
23a70 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  ELETE statement.
23a80 20 20 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20    The FORDELETE 
23a90 68 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64  hint is not used
23aa0 20 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c   by.** this impl
23ab0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74  ementation.  But
23ac0 20 69 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63   in a hypothetic
23ad0 61 6c 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73  al alternative s
23ae0 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a  torage engine .*
23af0 2a 20 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78  * in which index
23b00 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 75 74   entries are aut
23b10 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
23b20 65 64 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f  ed when correspo
23b30 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72  nding table.** r
23b40 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c  ows are deleted,
23b50 20 74 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66   the FORDELETE f
23b60 6c 61 67 20 69 73 20 61 20 68 69 6e 74 20 74 68  lag is a hint th
23b70 61 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20  at all SEEK and 
23b80 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74  DELETE.** operat
23b90 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72  ions on this cur
23ba0 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70  sor can be no-op
23bb0 73 20 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f  s and all READ o
23bc0 70 65 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a  perations can .*
23bd0 2a 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20  * return a null 
23be0 72 6f 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78  row (2-bytes: 0x
23bf0 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20  01 0x00)..**.** 
23c00 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
23c10 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
23c20 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
23c30 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
23c40 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
23c50 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
23c60 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
23c70 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
23c80 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
23c90 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
23ca0 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
23cb0 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  d that the sqlit
23cc0 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
23cd0 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  o() has been cal
23ce0 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74  led.** on pCur t
23cf0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
23d00 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72   memory space pr
23d10 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
23d20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
23d30 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
23d40 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
23d50 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
23d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d70 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
23d80 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
23d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
23db0 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
23dc0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
23dd0 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
23de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23df0 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
23e00 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
23e10 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
23e20 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
23e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23e40 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
23e50 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
23e60 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
23e70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
23e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
23e90 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
23ea0 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  sor */.){.  BtSh
23eb0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
23ec0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
23ed0 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74     /* Shared b-t
23ee0 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ree handle */.  
23ef0 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20  BtCursor *pX;   
23f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f10 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e         /* Loopin
23f20 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c  g over other all
23f30 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61   cursors */..  a
23f40 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
23f50 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
23f60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
23f70 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20  Flag==0 .       
23f80 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45  || wrFlag==BTREE
23f90 5f 57 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c  _WRCSR .       |
23fa0 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45  | wrFlag==(BTREE
23fb0 5f 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52  _WRCSR|BTREE_FOR
23fc0 44 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20  DELETE) .  );.. 
23fd0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
23fe0 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
23ff0 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
24000 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
24010 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
24020 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
24030 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
24040 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
24050 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
24060 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
24070 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
24080 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
24090 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
240a0 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
240b0 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
240c0 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
240d0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
240e0 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
240f0 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c  eyInfo!=0, (wrFl
24100 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73  ag?2:1)) );.  as
24110 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
24120 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
24130 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
24140 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
24150 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
24160 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
24170 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
24180 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
24190 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
241a0 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
241b0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
241c0 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
241d0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
241e0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
241f0 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
24200 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  1->aData );.  as
24210 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
24220 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  || (pBt->btsFlag
24230 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
24240 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  Y)==0 );..  if( 
24250 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c  wrFlag ){.    al
24260 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
24270 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42  pBt);.    if( pB
24280 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20  t->pTmpSpace==0 
24290 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
242a0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
242b0 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
242c0 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  && btreePagecoun
242d0 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20  t(pBt)==0 ){.   
242e0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
242f0 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65  =0 );.    iTable
24300 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
24310 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  Now that no othe
24320 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63  r errors can occ
24330 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69  ur, finish filli
24340 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73  ng in the BtCurs
24350 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  or.  ** variable
24360 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63  s and link the c
24370 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
24380 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a  tShared list.  *
24390 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  /.  pCur->pgnoRo
243a0 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c  ot = (Pgno)iTabl
243b0 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  e;.  pCur->iPage
243c0 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70   = -1;.  pCur->p
243d0 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
243e0 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72  fo;.  pCur->pBtr
243f0 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e  ee = p;.  pCur->
24400 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75  pBt = pBt;.  pCu
24410 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72  r->curFlags = wr
24420 46 6c 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74  Flag ? BTCF_Writ
24430 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75  eFlag : 0;.  pCu
24440 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
24450 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20   = wrFlag ? 0 : 
24460 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
24470 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  LY;.  /* If ther
24480 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
24490 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  e cursors on the
244a0 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65   same btree, the
244b0 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20  n all such.  ** 
244c0 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68  cursors *must* h
244d0 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  ave the BTCF_Mul
244e0 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20  tiple flag set. 
244f0 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d  */.  for(pX=pBt-
24500 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58  >pCursor; pX; pX
24510 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
24520 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f   if( pX->pgnoRoo
24530 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20  t==(Pgno)iTable 
24540 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72  ){.      pX->cur
24550 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75  Flags |= BTCF_Mu
24560 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43  ltiple;.      pC
24570 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
24580 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
24590 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d     }.  }.  pCur-
245a0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
245b0 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43  ursor;.  pBt->pC
245c0 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
245d0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
245e0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
245f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24600 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
24610 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
24620 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
24630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24650 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
24660 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
24670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24680 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
24690 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
246a0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
246b0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
246c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246d0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
246e0 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
246f0 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
24700 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
24710 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24720 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
24730 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
24740 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
24750 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24770 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
24780 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
24790 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69   int rc;.  if( i
247a0 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72  Table<1 ){.    r
247b0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
247c0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65  PT_BKPT;.  }else
247d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
247e0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
247f0 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
24800 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
24810 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
24820 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ur);.    sqlite3
24830 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
24840 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24850 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
24860 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
24870 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
24880 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
24890 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
248a0 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
248b0 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
248c0 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
248d0 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
248e0 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
248f0 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
24900 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
24910 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
24920 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
24930 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
24940 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
24950 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
24960 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
24970 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
24980 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
24990 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f  id){.  return RO
249a0 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75  UND8(sizeof(BtCu
249b0 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rsor));.}../*.**
249c0 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
249d0 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ry that will be 
249e0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
249f0 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
24a00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70  ..**.** The simp
24a10 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65  le approach here
24a20 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d   would be to mem
24a30 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65  set() the entire
24a40 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65   object.** to ze
24a50 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e  ro.  But it turn
24a60 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61  s out that the a
24a70 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64  pPage[] and aiId
24a80 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f  x[] arrays.** do
24a90 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
24aa0 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20  zeroed and they 
24ab0 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65  are large, so we
24ac0 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a   can save a lot.
24ad0 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62  ** of run-time b
24ae0 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  y skipping the i
24af0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
24b00 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e   those elements.
24b10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24b20 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
24b30 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
24b40 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66  memset(p, 0, off
24b50 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20  setof(BtCursor, 
24b60 42 54 43 55 52 53 4f 52 5f 46 49 52 53 54 5f 55  BTCURSOR_FIRST_U
24b70 4e 49 4e 49 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  NINIT));.}../*.*
24b80 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
24b90 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
24ba0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
24bb0 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
24bc0 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
24bd0 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
24be0 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
24bf0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
24c00 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
24c10 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
24c20 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
24c30 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
24c40 65 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  e ){.    BtShare
24c50 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
24c60 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
24c70 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
24c80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
24c90 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29  Bt->pCursor!=0 )
24ca0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
24cb0 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a  Cursor==pCur ){.
24cc0 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73        pBt->pCurs
24cd0 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
24ce0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24cf0 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72     BtCursor *pPr
24d00 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ev = pBt->pCurso
24d10 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  r;.      do{.   
24d20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e       if( pPrev->
24d30 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20  pNext==pCur ){. 
24d40 20 20 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e           pPrev->
24d50 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
24d60 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ext;.          b
24d70 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
24d80 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d 20          pPrev = 
24d90 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20  pPrev->pNext;.  
24da0 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41      }while( ALWA
24db0 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20  YS(pPrev) );.   
24dc0 20 7d 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65   }.    btreeRele
24dd0 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
24de0 73 28 70 43 75 72 29 3b 0a 20 20 20 20 75 6e 6c  s(pCur);.    unl
24df0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
24e00 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
24e10 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f  e3_free(pCur->aO
24e20 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 73 71  verflow);.    sq
24e30 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
24e40 3e 70 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69  >pKey);.    sqli
24e50 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
24e60 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
24e70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
24e80 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
24e90 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
24ea0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
24eb0 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
24ec0 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
24ed0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
24ee0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
24ef0 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
24f00 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
24f10 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
24f20 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
24f30 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
24f40 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
24f50 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
24f60 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
24f70 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
24f80 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
24f90 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
24fa0 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
24fb0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
24fc0 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 65  .  static int ce
24fd0 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 43 65 6c 6c  llInfoEqual(Cell
24fe0 49 6e 66 6f 20 2a 61 2c 20 43 65 6c 6c 49 6e 66  Info *a, CellInf
24ff0 6f 20 2a 62 29 7b 0a 20 20 20 20 69 66 28 20 61  o *b){.    if( a
25000 2d 3e 6e 4b 65 79 21 3d 62 2d 3e 6e 4b 65 79 20  ->nKey!=b->nKey 
25010 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
25020 69 66 28 20 61 2d 3e 70 50 61 79 6c 6f 61 64 21  if( a->pPayload!
25030 3d 62 2d 3e 70 50 61 79 6c 6f 61 64 20 29 20 72  =b->pPayload ) r
25040 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
25050 20 61 2d 3e 6e 50 61 79 6c 6f 61 64 21 3d 62 2d   a->nPayload!=b-
25060 3e 6e 50 61 79 6c 6f 61 64 20 29 20 72 65 74 75  >nPayload ) retu
25070 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d  rn 0;.    if( a-
25080 3e 6e 4c 6f 63 61 6c 21 3d 62 2d 3e 6e 4c 6f 63  >nLocal!=b->nLoc
25090 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  al ) return 0;. 
250a0 20 20 20 69 66 28 20 61 2d 3e 6e 53 69 7a 65 21     if( a->nSize!
250b0 3d 62 2d 3e 6e 53 69 7a 65 20 29 20 72 65 74 75  =b->nSize ) retu
250c0 72 6e 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 0;.    return
250d0 20 31 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69 63   1;.  }.  static
250e0 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
250f0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
25100 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
25110 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  fo info;.    mem
25120 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
25130 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
25140 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
25150 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75  pCur->pPage, pCu
25160 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a 20  r->ix, &info);. 
25170 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
25180 50 54 5f 44 42 20 7c 7c 20 63 65 6c 6c 49 6e 66  PT_DB || cellInf
25190 6f 45 71 75 61 6c 28 26 69 6e 66 6f 2c 20 26 70  oEqual(&info, &p
251a0 43 75 72 2d 3e 69 6e 66 6f 29 20 29 3b 0a 20 20  Cur->info) );.  
251b0 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
251c0 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
251d0 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  (x).#endif.stati
251e0 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
251f0 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  E void getCellIn
25200 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
25210 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  r){.  if( pCur->
25220 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
25230 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  .    pCur->curFl
25240 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
25250 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65  dNKey;.    btree
25260 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
25270 70 50 61 67 65 2c 70 43 75 72 2d 3e 69 78 2c 26  pPage,pCur->ix,&
25280 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
25290 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
252a0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
252b0 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
252c0 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
252d0 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
252e0 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
252f0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
25300 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
25310 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
25320 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
25330 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
25340 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
25350 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
25360 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
25370 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
25380 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
25390 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
253a0 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
253b0 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
253c0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
253d0 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
253e0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
253f0 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
25400 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
25410 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
25420 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25430 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
25440 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73   NDEBUG */.int s
25450 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
25460 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72  rIsValidNN(BtCur
25470 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
25480 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b  sert( pCur!=0 );
25490 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
254a0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
254b0 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ALID;.}../*.** R
254c0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
254d0 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
254e0 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f  ey or "rowid" fo
254f0 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e  r a table btree.
25500 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25510 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66   is only valid f
25520 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
25530 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
25540 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20  o a.** ordinary 
25550 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66  table btree.  If
25560 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
25570 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62  ts to an index b
25580 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e  tree or.** is in
25590 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c  valid, the resul
255a0 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  t of this routin
255b0 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  e is undefined..
255c0 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
255d0 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74  reeIntegerKey(Bt
255e0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
255f0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25600 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25610 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25620 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25630 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
25640 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e  ert( pCur->curIn
25650 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c  tKey );.  getCel
25660 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
25670 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
25680 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23 69 66 64 65 66  .nKey;.}..#ifdef
25690 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f   SQLITE_ENABLE_O
256a0 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 2f  FFSET_SQL_FUNC./
256b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
256c0 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  offset into the 
256d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
256e0 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  r the start of t
256f0 68 65 0a 2a 2a 20 70 61 79 6c 6f 61 64 20 74 6f  he.** payload to
25700 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
25710 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  r is pointing..*
25720 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72  /.i64 sqlite3Btr
25730 65 65 4f 66 66 73 65 74 28 42 74 43 75 72 73 6f  eeOffset(BtCurso
25740 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
25750 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
25760 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25770 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
25780 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
25790 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
257a0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74  nfo(pCur);.  ret
257b0 75 72 6e 20 28 69 36 34 29 70 43 75 72 2d 3e 70  urn (i64)pCur->p
257c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 28 69  Bt->pageSize*((i
257d0 36 34 29 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  64)pCur->pPage->
257e0 70 67 6e 6f 20 2d 20 31 29 20 2b 0a 20 20 20 20  pgno - 1) +.    
257f0 20 20 20 20 20 28 69 36 34 29 28 70 43 75 72 2d       (i64)(pCur-
25800 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d  >info.pPayload -
25810 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44   pCur->pPage->aD
25820 61 74 61 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ata);.}.#endif /
25830 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
25840 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 20  OFFSET_SQL_FUNC 
25850 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
25860 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
25870 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20  ytes of payload 
25880 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
25890 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63 75  at pCur is.** cu
258a0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
258b0 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65 20   to.  For table 
258c0 62 74 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c  btrees, this wil
258d0 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a  l be the amount.
258e0 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f 72  ** of data.  For
258f0 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20 74   index btrees, t
25900 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
25910 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 2e  size of the key.
25920 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
25930 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  r must guarantee
25940 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
25950 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
25960 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61  a non-NULL.** va
25970 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f  lid entry.  In o
25980 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
25990 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
259a0 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  e must guarantee
259b0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72  .** that the cur
259c0 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65  sor has Cursor.e
259d0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
259e0 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  LID..*/.u32 sqli
259f0 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53  te3BtreePayloadS
25a00 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
25a10 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
25a20 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
25a30 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
25a40 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
25a50 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
25a60 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
25a70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Cur);.  return p
25a80 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
25a90 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ad;.}../*.** Giv
25aa0 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
25ab0 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
25ac0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
25ad0 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
25ae0 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
25af0 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
25b00 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
25b10 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
25b20 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
25b30 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
25b40 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
25b50 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
25b60 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
25b70 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
25b80 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
25b90 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
25ba0 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
25bb0 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
25bc0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
25bd0 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
25be0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
25bf0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
25c00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
25c10 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
25c20 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
25c30 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
25c40 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ist is .** writt
25c50 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
25c60 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69  . If page ovfl i
25c70 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
25c80 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a  in its linked .*
25c90 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65  * list, *pPgnoNe
25ca0 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  xt is set to zer
25cb0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50  o. .**.** If ppP
25cc0 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  age is not NULL,
25cd0 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65   and a reference
25ce0 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
25cf0 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
25d00 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20  ding.** to page 
25d10 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73  number pOvfl was
25d20 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20   obtained, then 
25d30 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
25d40 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a  o point to that.
25d50 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74  ** reference. It
25d60 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
25d70 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
25d80 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c  ller to call rel
25d90 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e  easePage().** on
25da0 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65   *ppPage to free
25db0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20   the reference. 
25dc0 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  In no reference 
25dd0 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65  was obtained (be
25de0 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69  cause.** the poi
25df0 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65  nter-map was use
25e00 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
25e10 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f  value for *pPgno
25e20 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a  Next), then.** *
25e30 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
25e40 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
25e50 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
25e60 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
25e70 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
25e80 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
25e90 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
25ea0 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20  gno ovfl,       
25eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
25ec0 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  urrent overflow 
25ed0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
25ee0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
25ef0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
25f00 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
25f10 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c  ndle (may be NUL
25f20 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  L) */.  Pgno *pP
25f30 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
25f40 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
25f50 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
25f60 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
25f70 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
25f80 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
25f90 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
25fa0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
25fb0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
25fc0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
25fd0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
25fe0 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66  pPgnoNext);..#if
25ff0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26000 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
26010 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
26020 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
26030 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
26040 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
26050 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
26060 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
26070 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
26080 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
26090 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
260a0 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
260b0 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
260c0 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
260d0 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
260e0 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
260f0 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
26100 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
26110 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
26120 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
26130 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
26140 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
26150 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
26160 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
26170 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
26180 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
26190 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
261a0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
261b0 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
261c0 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
261d0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
261e0 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
261f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
26200 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67  iGuess<=btreePag
26210 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
26220 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
26230 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
26240 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
26250 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
26260 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70  QLITE_OK && eTyp
26270 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
26280 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
26290 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
262a0 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
262b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
262c0 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
262d0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
262e0 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d    assert( next==
262f0 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
26300 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
26310 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26320 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
26330 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
26340 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d  &pPage, (ppPage=
26350 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  =0) ? PAGER_GET_
26360 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20  READONLY : 0);. 
26370 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
26380 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
26390 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e==0 );.    if( 
263a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
263b0 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
263c0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
263d0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
263e0 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
263f0 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61  next;.  if( ppPa
26400 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  ge ){.    *ppPag
26410 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c  e = pPage;.  }el
26420 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
26430 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
26440 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
26450 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
26460 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
26470 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  /*.** Copy data 
26480 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f  from a buffer to
26490 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d   a page, or from
264a0 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66   a page to a buf
264b0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c  fer..**.** pPayl
264c0 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72  oad is a pointer
264d0 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20   to data stored 
264e0 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  on database page
264f0 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20   pDbPage..** If 
26500 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20  argument eOp is 
26510 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74  false, then nByt
26520 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
26530 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  are copied.** fr
26540 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74  om pPayload to t
26550 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
26560 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66  d at by pBuf. If
26570 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a   eOp is true,.**
26580 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   then sqlite3Pag
26590 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
265a0 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61  led on pDbPage a
265b0 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a  nd nByte bytes.*
265c0 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  * of data are co
265d0 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  pied from the bu
265e0 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61  ffer pBuf to pPa
265f0 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  yload..**.** SQL
26600 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
26610 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f  ed on success, o
26620 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
26630 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
26640 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61  c int copyPayloa
26650 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c  d(.  void *pPayl
26660 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  oad,           /
26670 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
26680 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  e data */.  void
26690 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
266a0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
266b0 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20   to buffer */.  
266c0 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
266d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
266e0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
266f0 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  copy */.  int eO
26700 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
26710 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79      /* 0 -> copy
26720 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e   from page, 1 ->
26730 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f   copy to page */
26740 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
26750 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
26760 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
26770 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  pPayload */.){. 
26780 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
26790 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
267a0 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65  m buffer to page
267b0 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74   (a write operat
267c0 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion) */.    int 
267d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
267e0 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
267f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
26800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26810 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
26820 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
26830 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74  load, pBuf, nByt
26840 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
26850 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
26860 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65  om page to buffe
26870 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74  r (a read operat
26880 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  ion) */.    memc
26890 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61  py(pBuf, pPayloa
268a0 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  d, nByte);.  }. 
268b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
268c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
268d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
268e0 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
268f0 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
26900 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
26910 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
26920 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
26930 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
26940 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75   The eOp.** argu
26950 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65  ment is interpre
26960 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
26970 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f  **.**   0: The o
26980 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65  peration is a re
26990 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ad. Populate the
269a0 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
269b0 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65  .**   1: The ope
269c0 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74  ration is a writ
269d0 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  e. Populate the 
269e0 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
269f0 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
26a00 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
26a10 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
26a20 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
26a30 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
26a40 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
26a50 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
26a60 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  uf..**.** The co
26a70 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64  ntent being read
26a80 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68   or written migh
26a90 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  t appear on the 
26aa0 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20  main page.** or 
26ab0 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
26ac0 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
26ad0 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a  rflow pages..**.
26ae0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
26af0 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  t cursor entry u
26b00 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
26b10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 2a  overflow pages.*
26b20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
26b30 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  may allocate spa
26b40 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
26b50 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68  y populate.** th
26b60 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
26b70 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79  list cache array
26b80 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
26b90 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65  flow). .** Subse
26ba0 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
26bb0 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61  this cache to ma
26bc0 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
26bd0 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
26be0 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63  t .** more effic
26bf0 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
26c00 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
26c10 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
26c20 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
26c30 20 69 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69   it must be.** i
26c40 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f  nvalidated if so
26c50 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20  me other cursor 
26c60 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61  writes to the sa
26c70 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a  me table, or if.
26c80 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
26c90 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66   moved to a diff
26ca0 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74  erent row. Addit
26cb0 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f  ionally, in auto
26cc0 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c  -vacuum.** mode,
26cd0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
26ce0 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69  vents may invali
26cf0 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  date an overflow
26d00 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
26d10 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69  ..**.**   * An i
26d20 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
26d30 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d  m,.**   * A comm
26d40 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75  it in auto_vacuu
26d50 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a  m="full" mode,.*
26d60 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61  *   * Creating a
26d70 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75   table (may requ
26d80 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76  ire moving an ov
26d90 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f  erflow page)..*/
26da0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65  .static int acce
26db0 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  ssPayload(.  BtC
26dc0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
26dd0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
26de0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
26df0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
26e00 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20  u32 offset,     
26e10 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
26e20 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69  ading this far i
26e30 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  nto payload */. 
26e40 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20   u32 amt,       
26e50 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
26e60 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f  is many bytes */
26e70 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
26e80 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65   *pBuf, /* Write
26e90 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20   the bytes into 
26ea0 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a  this buffer */ .
26eb0 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20    int eOp       
26ec0 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74         /* zero t
26ed0 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f  o read. non-zero
26ee0 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b   to write. */.){
26ef0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
26f00 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e   *aPayload;.  in
26f10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26f20 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
26f30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
26f40 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
26f50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26f60 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
26f70 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a   current entry *
26f80 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
26f90 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20  t = pCur->pBt;  
26fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fb0 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75  /* Btree this cu
26fc0 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rsor belongs to 
26fd0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
26fe0 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
26ff0 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64  _READ.  unsigned
27000 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42   char * const pB
27010 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b 20  ufStart = pBuf; 
27020 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
27030 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20 62 75 66  original out buf
27040 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  fer */.#endif.. 
27050 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
27060 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d  ;.  assert( eOp=
27070 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a  =0 || eOp==1 );.
27080 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27090 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
270a0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
270b0 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65  ( pCur->ix<pPage
270c0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
270d0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
270e0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
270f0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
27100 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
27110 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  = pCur->info.pPa
27120 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65 72 74 28  yload;.  assert(
27130 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
27140 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
27150 61 64 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ad );..  assert(
27160 20 61 50 61 79 6c 6f 61 64 20 3e 20 70 50 61 67   aPayload > pPag
27170 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 69 66  e->aData );.  if
27180 28 20 28 75 70 74 72 29 28 61 50 61 79 6c 6f 61  ( (uptr)(aPayloa
27190 64 20 2d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  d - pPage->aData
271a0 29 20 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  ) > (pBt->usable
271b0 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66  Size - pCur->inf
271c0 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20  o.nLocal) ){.   
271d0 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
271e0 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
271f0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
27200 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
27210 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f  .  The.    ** co
27220 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20  nditional above 
27230 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a  is really:.    *
27240 2a 20 20 20 20 26 61 50 61 79 6c 6f 61 64 5b 70  *    &aPayload[p
27250 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
27260 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
27270 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
27280 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20 69 73  e].    ** but is
27290 20 72 65 63 61 73 74 20 69 6e 74 6f 20 69 74 73   recast into its
272a0 20 63 75 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f   current form to
272b0 20 61 76 6f 69 64 20 69 6e 74 65 67 65 72 20 6f   avoid integer o
272c0 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73  verflow problems
272d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  .    */.    retu
272e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
272f0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
27300 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
27310 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
27320 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
27330 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
27340 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
27350 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
27360 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
27370 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
27380 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
27390 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
273a0 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
273b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
273c0 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
273d0 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
273e0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
273f0 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
27400 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
27410 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
27420 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
27430 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
27440 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
27450 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
27460 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
27470 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d  .  }...  if( rc=
27480 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
27490 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
274a0 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
274b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
274c0 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
274d0 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
274e0 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
274f0 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
27500 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
27510 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
27520 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
27530 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
27540 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
27550 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62  flow[] has not b
27560 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
27570 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a  llocate it now..
27580 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
27590 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
275a0 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 20  ray is sized at 
275b0 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
275c0 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
275d0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  .    ** in the o
275e0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
275f0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
27600 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
27610 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20  flow page is.   
27620 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   ** stored in aO
27630 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e  verflow[0], etc.
27640 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
27650 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
27660 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65   array.    ** me
27670 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
27680 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20 69  wn" (the cache i
27690 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
276a0 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
276b0 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
276c0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
276d0 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Ovfl)==0 ){.    
276e0 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
276f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
27700 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
27710 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
27720 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
27730 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
27740 66 6c 6f 77 3d 3d 30 0a 20 20 20 20 20 20 20 7c  flow==0.       |
27750 7c 20 6e 4f 76 66 6c 2a 28 69 6e 74 29 73 69 7a  | nOvfl*(int)siz
27760 65 6f 66 28 50 67 6e 6f 29 20 3e 20 73 71 6c 69  eof(Pgno) > sqli
27770 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 43  te3MallocSize(pC
27780 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 0a 20  ur->aOverflow). 
27790 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
277a0 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67  Pgno *aNew = (Pg
277b0 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c  no*)sqlite3Reall
277c0 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  oc(.            
277d0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c  pCur->aOverflow,
277e0 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28   nOvfl*2*sizeof(
277f0 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b  Pgno).        );
27800 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65  .        if( aNe
27810 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
27820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27830 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
27840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27850 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
27860 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20  flow = aNew;.   
27870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
27880 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
27890 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
278a0 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
278b0 6f 29 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  o));.      pCur-
278c0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
278d0 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
278e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
278f0 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
27900 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
27910 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
27920 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
27930 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
27940 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
27950 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
27960 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
27970 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79       ** directly
27980 20 74 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f   to it..      */
27990 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
279a0 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
279b0 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
279c0 20 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f         iIdx = (o
279d0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
279e0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67  .        nextPag
279f0 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
27a00 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
27a10 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
27a20 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
27a30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
27a40 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
27a50 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
27a60 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e   );.    while( n
27a70 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20 20  extPage ){.     
27a80 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
27a90 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
27aa0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
27ab0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
27ac0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
27ad0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
27ae0 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
27af0 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
27b00 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
27b10 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge.             
27b20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
27b30 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
27b40 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
27b50 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 20  nextPage;..     
27b60 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
27b70 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
27b80 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
27b90 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
27ba0 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
27bb0 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
27bc0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
27bd0 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
27be0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
27bf0 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
27c00 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
27c10 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
27c20 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
27c30 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
27c40 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
27c50 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
27c60 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
27c70 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
27c80 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
27c90 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
27ca0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
27cb0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27cc0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
27cd0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
27ce0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
27cf0 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65  rt( pCur->pBtree
27d00 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b  ->db==pBt->db );
27d10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
27d20 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
27d30 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
27d40 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
27d50 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
27d60 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  x+1];.        }e
27d70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
27d80 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
27d90 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
27da0 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
27db0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27dc0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
27dd0 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
27de0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
27df0 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
27e00 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
27e10 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
27e20 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
27e30 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
27e40 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
27e50 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
27e60 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
27e70 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  )..        */.#i
27e80 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
27e90 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
27ea0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27eb0 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20  _file *fd;      
27ec0 2f 2a 20 46 69 6c 65 20 66 72 6f 6d 20 77 68 69  /* File from whi
27ed0 63 68 20 74 6f 20 64 6f 20 64 69 72 65 63 74 20  ch to do direct 
27ee0 6f 76 65 72 66 6c 6f 77 20 72 65 61 64 20 2a 2f  overflow read */
27ef0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
27f00 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
27f10 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
27f20 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
27f30 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20  {.          a = 
27f40 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
27f50 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69  t;.        }..#i
27f60 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
27f70 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
27f80 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
27f90 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ll the following
27fa0 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20   are true:.     
27fb0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
27fc0 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20     1) this is a 
27fd0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20  read operation, 
27fe0 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  and .        ** 
27ff0 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71    2) data is req
28000 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73  uired from the s
28010 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65  tart of this ove
28020 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a  rflow page, and.
28030 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20          **   3) 
28040 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
28050 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
28060 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  on, and.        
28070 2a 2a 20 20 20 34 29 20 74 68 65 20 64 61 74 61  **   4) the data
28080 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63  base is file-bac
28090 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ked, and.       
280a0 20 2a 2a 20 20 20 35 29 20 74 68 65 20 70 61 67   **   5) the pag
280b0 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
280c0 57 41 4c 20 66 69 6c 65 0a 20 20 20 20 20 20 20  WAL file.       
280d0 20 2a 2a 20 20 20 36 29 20 61 74 20 6c 65 61 73   **   6) at leas
280e0 74 20 34 20 62 79 74 65 73 20 68 61 76 65 20 61  t 4 bytes have a
280f0 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 61 64  lready been read
28100 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
28110 20 62 75 66 66 65 72 20 0a 20 20 20 20 20 20 20   buffer .       
28120 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   **.        ** t
28130 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20  hen data can be 
28140 72 65 61 64 20 64 69 72 65 63 74 6c 79 20 66 72  read directly fr
28150 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
28160 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20  file into the.  
28170 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20        ** output 
28180 62 75 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e  buffer, bypassin
28190 67 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  g the page-cache
281a0 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69   altogether. Thi
281b0 73 20 73 70 65 65 64 73 0a 20 20 20 20 20 20 20  s speeds.       
281c0 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c   ** up loading l
281d0 61 72 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  arge records tha
281e0 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72  t span many over
281f0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20  flow pages..    
28200 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
28210 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20 20 20  f( eOp==0       
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28240 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a        /* (1) */.
28250 20 20 20 20 20 20 20 20 20 26 26 20 6f 66 66 73           && offs
28260 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  et==0           
28270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28290 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (2) */.       
282a0 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e    && pBt->inTran
282b0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52  saction==TRANS_R
282c0 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
282d0 20 20 20 20 20 20 20 20 2f 2a 20 28 33 29 20 2a          /* (3) *
282e0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66  /.         && (f
282f0 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
28300 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
28310 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20  ))->pMethods    
28320 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20   /* (4) */.     
28330 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
28340 33 50 61 67 65 72 55 73 65 57 61 6c 28 70 42 74  3PagerUseWal(pBt
28350 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
28360 67 65 29 20 20 20 20 20 20 20 2f 2a 20 28 35 29  ge)       /* (5)
28370 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
28380 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53  &pBuf[-4]>=pBufS
28390 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20 20  tart            
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283b0 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20     /* (6) */.   
283c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
283d0 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20    u8 aSave[4];. 
283e0 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72           u8 *aWr
283f0 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b  ite = &pBuf[-4];
28400 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
28410 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53  t( aWrite>=pBufS
28420 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20 20  tart );         
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28440 2f 2a 20 64 75 65 20 74 6f 20 28 36 29 20 2a 2f  /* due to (6) */
28450 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
28460 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c  y(aSave, aWrite,
28470 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   4);.          r
28480 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
28490 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b  d(fd, aWrite, a+
284a0 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67  4, (i64)pBt->pag
284b0 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d  eSize*(nextPage-
284c0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  1));.          n
284d0 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
284e0 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20  te(aWrite);.    
284f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72        memcpy(aWr
28500 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a  ite, aSave, 4);.
28510 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
28520 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a  ndif..        {.
28530 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65            DbPage
28540 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20   *pDbPage;.     
28550 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28560 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
28570 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
28580 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20   &pDbPage,.     
28590 20 20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d 30           (eOp==0
285a0 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
285b0 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20  DONLY : 0).     
285c0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
285d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
285e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
285f0 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
28600 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
28610 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
28620 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
28630 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
28640 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
28650 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
28660 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
28670 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61  fset+4], pBuf, a
28680 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b  , eOp, pDbPage);
28690 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
286a0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
286b0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
286c0 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
286d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
286e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
286f0 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20  mt -= a;.       
28700 20 69 66 28 20 61 6d 74 3d 3d 30 20 29 20 72 65   if( amt==0 ) re
28710 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
28720 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
28730 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
28740 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
28750 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  iIdx++;.    }.  
28760 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
28770 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
28780 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c  ){.    /* Overfl
28790 6f 77 20 63 68 61 69 6e 20 65 6e 64 73 20 70 72  ow chain ends pr
287a0 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20 20  ematurely */.   
287b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
287c0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
287d0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
287e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
287f0 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  ad part of the p
28800 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72  ayload for the r
28810 6f 77 20 61 74 20 77 68 69 63 68 20 74 68 61 74  ow at which that
28820 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
28830 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
28840 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79  nting.  "amt" by
28850 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
28860 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75  sferred into pBu
28870 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
28880 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
28890 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
288a0 70 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e  pCur can be poin
288b0 74 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61  ting to either a
288c0 20 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64   table or an ind
288d0 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66  ex b-tree..** If
288e0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74   pointing to a t
288f0 61 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e  able btree, then
28900 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63   the content sec
28910 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49  tion is read.  I
28920 66 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69  f.** pCur is poi
28930 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  nting to an inde
28940 78 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68  x b-tree then th
28950 65 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73  e key section is
28960 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   read..**.** For
28970 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
28980 6c 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c  load(), the call
28990 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
289a0 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e  hat pCur is poin
289b0 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
289c0 69 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61  id row in the ta
289d0 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65  ble.  For sqlite
289e0 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65  3BtreePayloadChe
289f0 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63  cked(), the.** c
28a00 75 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69  ursor might be i
28a10 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20  nvalid or might 
28a20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f  need to be resto
28a30 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67  red before being
28a40 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   read..**.** Ret
28a50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
28a60 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
28a70 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
28a80 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
28a90 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
28aa0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
28ab0 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
28ac0 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
28ad0 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
28ae0 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
28af0 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42  e3BtreePayload(B
28b00 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
28b10 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
28b20 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
28b30 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
28b40 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
28b50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
28b60 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28b70 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
28b80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
28b90 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70  ge>=0 && pCur->p
28ba0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
28bb0 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d  ( pCur->ix<pCur-
28bc0 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
28bd0 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73  .  return access
28be0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
28bf0 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
28c00 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
28c10 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   0);.}../*.** Th
28c20 69 73 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71  is variant of sq
28c30 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
28c40 64 28 29 20 77 6f 72 6b 73 20 65 76 65 6e 20 69  d() works even i
28c50 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  f the cursor has
28c60 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 43   not.** in the C
28c70 55 52 53 4f 52 5f 56 41 4c 49 44 20 73 74 61 74  URSOR_VALID stat
28c80 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 75  e.  It is only u
28c90 73 65 64 20 62 79 20 74 68 65 20 73 71 6c 69 74  sed by the sqlit
28ca0 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a  e3_blob_read().*
28cb0 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  * interface..*/.
28cc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28cd0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74 61  MIT_INCRBLOB.sta
28ce0 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
28cf0 49 4e 45 20 69 6e 74 20 61 63 63 65 73 73 50 61  INE int accessPa
28d00 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a 20 20  yloadChecked(.  
28d10 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 0a  BtCursor *pCur,.
28d20 20 20 75 33 32 20 6f 66 66 73 65 74 2c 0a 20 20    u32 offset,.  
28d30 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64 20  u32 amt,.  void 
28d40 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20 72  *pBuf.){.  int r
28d50 63 3b 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e  c;.  if ( pCur->
28d60 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
28d70 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  NVALID ){.    re
28d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
28d90 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
28da0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
28db0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72  red(pCur) );.  r
28dc0 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f 72 65  c = btreeRestore
28dd0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
28de0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Cur);.  return r
28df0 63 20 3f 20 72 63 20 3a 20 61 63 63 65 73 73 50  c ? rc : accessP
28e00 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
28e10 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
28e20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
28e30 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65  3BtreePayloadChe
28e40 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  cked(BtCursor *p
28e50 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
28e60 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
28e70 70 42 75 66 29 7b 0a 20 20 69 66 28 20 70 43 75  pBuf){.  if( pCu
28e80 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28e90 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61  R_VALID ){.    a
28ea0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
28eb0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
28ec0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63  );.    return ac
28ed0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
28ee0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
28ef0 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  Buf, 0);.  }else
28f00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63 63  {.    return acc
28f10 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65  essPayloadChecke
28f20 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
28f30 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d 0a  amt, pBuf);.  }.
28f40 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
28f50 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
28f60 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
28f70 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  n a pointer to p
28f80 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
28f90 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72  on from the entr
28fa0 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70  y that the .** p
28fb0 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
28fc0 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
28fd0 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68  pointer is to th
28fe0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a  e beginning of.*
28ff0 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e 64  * the key if ind
29000 65 78 20 62 74 72 65 65 73 20 28 70 50 61 67 65  ex btrees (pPage
29010 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e 64  ->intKey==0) and
29020 20 69 73 20 74 68 65 20 64 61 74 61 20 66 6f 72   is the data for
29030 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65 73  .** table btrees
29040 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d   (pPage->intKey=
29050 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72 20  =1). The number 
29060 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
29070 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61 74  lable.** key/dat
29080 61 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  a is written int
29090 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
290a0 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
290b0 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e 65  value.** returne
290c0 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 20  d will not be a 
290d0 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
290e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
290f0 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
29100 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
29110 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
29120 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
29130 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
29140 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
29150 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
29160 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
29170 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
29180 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
29190 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
291a0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
291b0 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
291c0 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
291d0 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
291e0 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
291f0 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
29200 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
29210 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
29220 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
29230 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20  o reassemble.** 
29240 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
29250 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
29260 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
29270 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
29280 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
29290 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
292a0 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
292b0 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
292c0 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
292d0 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
292e0 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
292f0 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
29300 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
29310 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
29320 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
29330 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63 68  onst void *fetch
29340 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
29350 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
29360 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
29370 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
29380 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ead from */.  u3
29390 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20 20  2 *pAmt         
293a0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
293b0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
293c0 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a  ble bytes here *
293d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a  /.){.  int amt;.
293e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
293f0 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65  0 && pCur->iPage
29400 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61  >=0 && pCur->pPa
29410 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge);.  assert( p
29420 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29430 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
29440 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
29450 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
29460 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
29470 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
29480 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
29490 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
294a0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
294b0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
294c0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
294d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e  Cur->info.nSize>
294e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
294f0 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
29500 61 64 3e 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ad>pCur->pPage->
29510 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54  aData || CORRUPT
29520 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
29530 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
29540 6c 6f 61 64 3c 70 43 75 72 2d 3e 70 50 61 67 65  load<pCur->pPage
29550 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52  ->aDataEnd ||COR
29560 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20  RUPT_DB);.  amt 
29570 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
29580 63 61 6c 3b 0a 20 20 69 66 28 20 61 6d 74 3e 28  cal;.  if( amt>(
29590 69 6e 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65  int)(pCur->pPage
295a0 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75  ->aDataEnd - pCu
295b0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
295c0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  ) ){.    /* Ther
295d0 65 20 69 73 20 74 6f 6f 20 6c 69 74 74 6c 65 20  e is too little 
295e0 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
295f0 65 20 66 6f 72 20 74 68 65 20 65 78 70 65 63 74  e for the expect
29600 65 64 20 61 6d 6f 75 6e 74 0a 20 20 20 20 2a 2a  ed amount.    **
29610 20 6f 66 20 6c 6f 63 61 6c 20 63 6f 6e 74 65 6e   of local conten
29620 74 2e 20 44 61 74 61 62 61 73 65 20 6d 75 73 74  t. Database must
29630 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a   be corrupt. */.
29640 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52      assert( CORR
29650 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 6d  UPT_DB );.    am
29660 74 20 3d 20 4d 41 58 28 30 2c 20 28 69 6e 74 29  t = MAX(0, (int)
29670 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44  (pCur->pPage->aD
29680 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69  ataEnd - pCur->i
29690 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 29 3b 0a  nfo.pPayload));.
296a0 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 28 75    }.  *pAmt = (u
296b0 33 32 29 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e  32)amt;.  return
296c0 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e   (void*)pCur->in
296d0 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  fo.pPayload;.}..
296e0 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
296f0 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
29700 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
29710 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
29720 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
29730 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
29740 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
29750 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
29760 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
29770 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
29780 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
29790 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
297a0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
297b0 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
297c0 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
297d0 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
297e0 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
297f0 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
29800 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
29810 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
29820 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
29830 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
29840 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
29850 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
29860 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
29870 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
29880 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
29890 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
298a0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
298b0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
298c0 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
298d0 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
298e0 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
298f0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
29900 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
29910 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
29920 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
29930 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
29940 6f 61 64 46 65 74 63 68 28 42 74 43 75 72 73 6f  oadFetch(BtCurso
29950 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41  r *pCur, u32 *pA
29960 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65  mt){.  return fe
29970 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
29980 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pAmt);.}.../*.*
29990 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
299a0 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20  r down to a new 
299b0 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
299c0 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e   newPgno argumen
299d0 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  t is the.** page
299e0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63   number of the c
299f0 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76  hild page to mov
29a00 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  e to..**.** This
29a10 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
29a20 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
29a30 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61   if the page-hea
29a40 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20  der flags field 
29a50 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68  of.** the new ch
29a60 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f  ild page does no
29a70 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67  t match the flag
29a80 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70  s field of the p
29a90 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69  arent (i.e..** i
29aa0 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65  f an intkey page
29ab0 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74   appears to be t
29ac0 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e  he parent of a n
29ad0 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20  on-intkey page, 
29ae0 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61  or.** vice-versa
29af0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
29b00 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
29b10 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
29b20 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53   newPgno){.  BtS
29b30 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
29b40 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  r->pBt;..  asser
29b50 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
29b60 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
29b70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29b80 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29b90 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
29ba0 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
29bb0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
29bc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29bd0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  r->iPage>=0 );. 
29be0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
29bf0 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
29c00 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
29c10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
29c20 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
29c30 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
29c40 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
29c50 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
29c60 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
29c70 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
29c80 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29c90 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d  ->iPage] = pCur-
29ca0 3e 69 78 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50  >ix;.  pCur->apP
29cb0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
29cc0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
29cd0 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a    pCur->ix = 0;.
29ce0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b    pCur->iPage++;
29cf0 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41 6e 64  .  return getAnd
29d00 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
29d10 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 70 50  wPgno, &pCur->pP
29d20 61 67 65 2c 20 70 43 75 72 2c 20 70 43 75 72 2d  age, pCur, pCur-
29d30 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b  >curPagerFlags);
29d40 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
29d50 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61  E_DEBUG./*.** Pa
29d60 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
29d70 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
29d80 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
29d90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
29da0 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
29db0 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
29dc0 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
29dd0 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
29de0 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
29df0 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
29e00 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
29e10 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
29e20 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
29e30 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
29e40 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
29e50 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
29e60 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
29e70 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
29e80 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
29e90 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
29ea0 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
29eb0 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
29ec0 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54  ){.  if( CORRUPT
29ed0 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  _DB ) return;  /
29ee0 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  * The conditions
29ef0 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69   tested below mi
29f00 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a  ght not be true.
29f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
29f30 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  n a corrupt data
29f40 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  base */.  assert
29f50 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
29f60 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
29f70 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
29f80 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
29f90 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
29fa0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
29fb0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
29fc0 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
29fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
29fe0 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
29ff0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
2a000 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
2a010 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
2a020 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
2a030 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
2a040 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
2a050 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
2a060 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
2a070 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
2a080 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
2a090 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
2a0a0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2a0b0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
2a0c0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
2a0d0 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
2a0e0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
2a0f0 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
2a100 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
2a110 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
2a120 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
2a130 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
2a140 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
2a150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2a160 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
2a170 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2a180 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 3b   MemPage *pLeaf;
2a190 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2a1a0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2a1b0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2a1c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2a1d0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2a1e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2a1f0 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
2a200 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20  rt( pCur->pPage 
2a210 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e  );.  assertParen
2a220 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72  tIndex(.    pCur
2a230 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a240 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
2a250 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2a260 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
2a270 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f  Cur->pPage->pgno
2a280 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  .  );.  testcase
2a290 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2a2a0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70  ur->iPage-1] > p
2a2b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a2c0 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c  ->iPage-1]->nCel
2a2d0 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  l );.  pCur->inf
2a2e0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2a2f0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2a300 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
2a310 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2a320 29 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  );.  pCur->ix = 
2a330 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2a340 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 70 4c  ->iPage-1];.  pL
2a350 65 61 66 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  eaf = pCur->pPag
2a360 65 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65  e;.  pCur->pPage
2a370 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2a380 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  --pCur->iPage];.
2a390 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
2a3a0 4e 75 6c 6c 28 70 4c 65 61 66 29 3b 0a 7d 0a 0a  Null(pLeaf);.}..
2a3b0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
2a3c0 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
2a3d0 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
2a3e0 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74  of its b-tree st
2a3f0 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
2a400 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  f the table has 
2a410 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
2a420 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75  age, then the cu
2a430 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
2a440 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65   point.** to the
2a450 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
2a460 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ge instead of th
2a470 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
2a480 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20  ge. A table has 
2a490 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  a.** virtual roo
2a4a0 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20  t page when the 
2a4b0 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
2a4c0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
2a4d0 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e  ls and a .** sin
2a4e0 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20  gle child page. 
2a4f0 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  This can only ha
2a500 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61  ppen with the ta
2a510 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
2a520 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge 1..**.** If t
2a530 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  he b-tree struct
2a540 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  ure is empty, th
2a550 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
2a560 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52  s set to .** CUR
2a570 53 4f 52 5f 49 4e 56 41 4c 49 44 20 61 6e 64 20  SOR_INVALID and 
2a580 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
2a590 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50 54  urns SQLITE_EMPT
2a5a0 59 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  Y. Otherwise,.**
2a5b0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
2a5c0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
2a5d0 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6c 6f  he first cell lo
2a5e0 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f  cated on the roo
2a5f0 74 0a 2a 2a 20 28 6f 72 20 76 69 72 74 75 61 6c  t.** (or virtual
2a600 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
2a610 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
2a620 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
2a630 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49  R_VALID..**.** I
2a640 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2a650 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66  returns successf
2a660 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20  ully, it may be 
2a670 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
2a680 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20  .** page-header 
2a690 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74  flags indicate t
2a6a0 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c  hat the [virtual
2a6b0 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74  ] root-page is t
2a6c0 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20  he expected .** 
2a6d0 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70  kind of b-tree p
2a6e0 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65  age (i.e. if whe
2a6f0 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75  n opening the cu
2a700 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20  rsor the caller 
2a710 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69  did not.** speci
2a720 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  fy a KeyInfo str
2a730 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
2a740 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
2a750 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a  0x05 or 0x0D,.**
2a760 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61   indicating a ta
2a770 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69  ble b-tree, or i
2a780 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  f the caller did
2a790 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
2a7a0 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  fo .** structure
2a7b0 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
2a7c0 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f  is set to 0x02 o
2a7d0 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69  r 0x0A, indicati
2a7e0 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62  ng an index.** b
2a7f0 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  -tree)..*/.stati
2a800 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74  c int moveToRoot
2a810 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2a820 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  {.  MemPage *pRo
2a830 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ot;.  int rc = S
2a840 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
2a850 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2a860 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2a870 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
2a880 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
2a890 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
2a8a0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
2a8b0 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
2a8c0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2a8d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
2a8e0 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
2a8f0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2a900 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a910 75 72 2d 3e 65 53 74 61 74 65 20 3c 20 43 55 52  ur->eState < CUR
2a920 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2a930 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 30  || pCur->iPage<0
2a940 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a950 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3e 30 20 7c  ur->pgnoRoot>0 |
2a960 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 30 20  | pCur->iPage<0 
2a970 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
2a980 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  iPage>=0 ){.    
2a990 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20  if( pCur->iPage 
2a9a0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
2a9b0 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72  PageNotNull(pCur
2a9c0 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->pPage);.      
2a9d0 77 68 69 6c 65 28 20 2d 2d 70 43 75 72 2d 3e 69  while( --pCur->i
2a9e0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2a9f0 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
2aa00 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
2aa10 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
2aa20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
2aa30 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d  r->pPage = pCur-
2aa40 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 20 20  >apPage[0];.    
2aa50 20 20 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74    goto skip_init
2aa60 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
2aa70 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  if( pCur->pgnoRo
2aa80 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75  ot==0 ){.    pCu
2aa90 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2aaa0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2aab0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d  return SQLITE_EM
2aac0 50 54 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  PTY;.  }else{.  
2aad0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2aae0 69 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20  iPage==(-1) );. 
2aaf0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
2ab00 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
2ab10 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 20  IRESEEK ){.     
2ab20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2ab30 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
2ab40 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2ab50 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2ab60 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
2ab70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
2ab80 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
2ab90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2aba0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
2abb0 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20  rsor(pCur);.    
2abc0 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  }.    rc = getAn
2abd0 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e  dInitPage(pCur->
2abe0 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75  pBtree->pBt, pCu
2abf0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
2ac00 75 72 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20 20  ur->pPage,.     
2ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac20 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50     0, pCur->curP
2ac30 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20  agerFlags);.    
2ac40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ac50 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
2ac60 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2ac70 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
2ac80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2ac90 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
2aca0 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
2acb0 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72  curIntKey = pCur
2acc0 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3b  ->pPage->intKey;
2acd0 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70  .  }.  pRoot = p
2ace0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
2acf0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
2ad00 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
2ad10 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43  t );..  /* If pC
2ad20 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20  ur->pKeyInfo is 
2ad30 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
2ad40 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f  he caller that o
2ad50 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f  pened this curso
2ad60 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20  r.  ** expected 
2ad70 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e  to open it on an
2ad80 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f   index b-tree. O
2ad90 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65  therwise, if pKe
2ada0 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55  yInfo is.  ** NU
2adb0 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65  LL, the caller e
2adc0 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62  xpects a table b
2add0 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69  -tree. If this i
2ade0 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a  s not the case,.
2adf0 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53    ** return an S
2ae00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
2ae10 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ror. .  **.  ** 
2ae20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  Earlier versions
2ae30 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d   of SQLite assum
2ae40 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73  ed that this tes
2ae50 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c  t could not fail
2ae60 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f  .  ** if the roo
2ae70 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61  t page was alrea
2ae80 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74  dy loaded when t
2ae90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
2aea0 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20   called (i.e..  
2aeb0 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67  ** if pCur->iPag
2aec0 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20  e>=0). But this 
2aed0 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65  is not so if the
2aee0 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
2aef0 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20  rupted .  ** in 
2af00 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
2af10 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69  page pRoot is li
2af20 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f  nked into a seco
2af30 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20  nd b-tree table 
2af40 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72  .  ** (or the fr
2af50 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61  eelist).  */.  a
2af60 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e  ssert( pRoot->in
2af70 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74  tKey==1 || pRoot
2af80 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
2af90 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e   if( pRoot->isIn
2afa0 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  it==0 || (pCur->
2afb0 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52  pKeyInfo==0)!=pR
2afc0 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  oot->intKey ){. 
2afd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2afe0 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 43  _CORRUPT_PAGE(pC
2aff0 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 7d 0a  ur->pPage);.  }.
2b000 0a 73 6b 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20  .skip_init:  .  
2b010 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20 20  pCur->ix = 0;.  
2b020 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2b030 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2b040 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2b050 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2b060 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2b070 64 4f 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74  dOvfl);..  pRoot
2b080 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
2b090 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
2b0a0 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ll>0 ){.    pCur
2b0b0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2b0c0 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65  R_VALID;.  }else
2b0d0 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61   if( !pRoot->lea
2b0e0 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
2b0f0 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  bpage;.    if( p
2b100 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20  Root->pgno!=1 ) 
2b110 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2b120 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2b130 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
2b140 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
2b150 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
2b160 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
2b170 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2b180 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  _VALID;.    rc =
2b190 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2b1a0 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d  r, subpage);.  }
2b1b0 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e  else{.    pCur->
2b1c0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2b1d0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  INVALID;.    rc 
2b1e0 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a  = SQLITE_EMPTY;.
2b1f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2b200 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
2b210 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
2b220 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
2b230 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
2b240 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
2b250 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
2b260 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
2b270 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
2b280 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
2b290 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
2b2a0 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
2b2b0 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
2b2c0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
2b2d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2b2e0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
2b2f0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2b300 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
2b310 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b320 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2b330 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2b340 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2b350 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2b360 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2b370 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2b380 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
2b390 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
2b3a0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2b3b0 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  e)->leaf ){.    
2b3c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
2b3d0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
2b3e0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
2b3f0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2b400 61 67 65 2c 20 70 43 75 72 2d 3e 69 78 29 29 3b  age, pCur->ix));
2b410 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2b420 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
2b430 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b440 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
2b450 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
2b460 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
2b470 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
2b480 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
2b490 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
2b4a0 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
2b4b0 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
2b4c0 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
2b4d0 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
2b4e0 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
2b4f0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
2b500 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2b510 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
2b520 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
2b530 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
2b540 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
2b550 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
2b560 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
2b570 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
2b580 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
2b590 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
2b5a0 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
2b5b0 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
2b5c0 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
2b5d0 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
2b5e0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
2b5f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2b600 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
2b610 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2b620 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
2b630 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2b640 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2b650 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
2b660 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2b670 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2b680 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2b690 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2b6a0 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
2b6b0 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
2b6c0 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a  pPage)->leaf ){.
2b6d0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
2b6e0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2b6f0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2b700 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
2b710 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43  ->ix = pPage->nC
2b720 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ell;.    rc = mo
2b730 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2b740 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
2b750 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2b760 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20   }.  pCur->ix = 
2b770 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
2b780 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b790 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
2b7a0 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
2b7b0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2b7c0 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20  F_ValidNKey)==0 
2b7d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2b7e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  TE_OK;.}../* Mov
2b7f0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2b800 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
2b810 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
2b820 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
2b830 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
2b840 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
2b850 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
2b860 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
2b870 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
2b880 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
2b890 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2b8a0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2b8b0 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
2b8c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2b8d0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2b8e0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
2b8f0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2b900 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2b910 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2b920 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2b930 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2b940 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
2b950 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2b960 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b970 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
2b980 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
2b990 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 2a 70 52  ell>0 );.    *pR
2b9a0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  es = 0;.    rc =
2b9b0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2b9c0 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69  pCur);.  }else i
2b9d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d  f( rc==SQLITE_EM
2b9e0 50 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PTY ){.    asser
2b9f0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2ba00 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50  t==0 || pCur->pP
2ba10 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
2ba20 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
2ba30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ba40 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
2ba50 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
2ba60 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2ba70 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2ba80 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
2ba90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
2baa0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
2bab0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
2bac0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
2bad0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
2bae0 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
2baf0 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
2bb00 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2bb10 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
2bb20 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
2bb30 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2bb40 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
2bb50 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  . .  assert( cur
2bb60 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2bb70 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2bb80 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2bb90 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
2bba0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
2bbb0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2bbc0 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f  ursor already po
2bbd0 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74  ints to the last
2bbe0 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20   entry, this is 
2bbf0 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66  a no-op. */.  if
2bc00 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
2bc10 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20  pCur->eState && 
2bc20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2bc30 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
2bc40 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
2bc50 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
2bc60 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
2bc70 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  s to assert() th
2bc80 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65  at the cursor re
2bc90 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20  ally does point 
2bca0 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c  .    ** to the l
2bcb0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2bcc0 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20   b-tree. */.    
2bcd0 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
2bce0 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69  ii=0; ii<pCur->i
2bcf0 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
2bd00 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2bd10 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72  >aiIdx[ii]==pCur
2bd20 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43  ->apPage[ii]->nC
2bd30 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ell );.    }.   
2bd40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2bd50 78 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  x==pCur->pPage->
2bd60 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61  nCell-1 );.    a
2bd70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2bd80 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64  ge->leaf );.#end
2bd90 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
2bda0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2bdb0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
2bdc0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
2bdd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bde0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2bdf0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2be00 41 4c 49 44 20 29 3b 0a 20 20 20 20 2a 70 52 65  ALID );.    *pRe
2be10 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  s = 0;.    rc = 
2be20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2be30 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2be40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2be50 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2be60 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c  lags |= BTCF_AtL
2be70 61 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ast;.    }else{.
2be80 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2be90 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74  lags &= ~BTCF_At
2bea0 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Last;.    }.  }e
2beb0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2bec0 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20  TE_EMPTY ){.    
2bed0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2bee0 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2bef0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  r->pPage->nCell=
2bf00 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  =0 );.    *pRes 
2bf10 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  = 1;.    rc = SQ
2bf20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
2bf30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2bf40 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2bf50 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
2bf60 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
2bf70 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
2bf80 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
2bf90 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
2bfa0 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
2bfb0 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
2bfc0 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
2bfd0 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
2bfe0 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
2bff0 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
2c000 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
2c010 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
2c020 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
2c030 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
2c040 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
2c050 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
2c060 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
2c070 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2c080 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
2c090 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
2c0a0 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
2c0b0 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
2c0c0 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
2c0d0 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
2c0e0 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
2c0f0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
2c100 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
2c110 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
2c120 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
2c130 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
2c140 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
2c150 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
2c160 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
2c170 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
2c180 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
2c190 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
2c1a0 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
2c1b0 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
2c1c0 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
2c1d0 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
2c1e0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2c1f0 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
2c200 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2c210 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2c220 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2c230 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2c240 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
2c250 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
2c260 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
2c270 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
2c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c290 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
2c2a0 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
2c2b0 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
2c2c0 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
2c2d0 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
2c2e0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2c2f0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2c300 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2c310 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
2c320 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
2c330 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
2c340 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
2c350 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2c360 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2c370 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2c380 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2c390 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
2c3a0 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
2c3b0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65  ..**.** For inde
2c3c0 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70 49  x tables, the pI
2c3d0 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66 69  dxKey->eqSeen fi
2c3e0 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31 20  eld is set to 1 
2c3f0 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73  if there.** exis
2c400 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ts an entry in t
2c410 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 65 78  he table that ex
2c420 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70 49  actly matches pI
2c430 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20  dxKey.  .*/.int 
2c440 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
2c450 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74  toUnpacked(.  Bt
2c460 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
2c470 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
2c480 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
2c490 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
2c4a0 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f  cord *pIdxKey, /
2c4b0 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
2c4c0 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e   key */.  i64 in
2c4d0 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  tKey,           
2c4e0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
2c4f0 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  key */.  int bia
2c500 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
2c510 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69    /* If true, bi
2c520 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  as the search to
2c530 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
2c540 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
2c550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2c560 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
2c570 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
2c580 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72   int rc;.  Recor
2c590 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64  dCompare xRecord
2c5a0 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65  Compare;..  asse
2c5b0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2c5c0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2c5d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2c5e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2c5f0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2c600 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2c610 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
2c620 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
2c630 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
2c640 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65  fo==0) );.  asse
2c650 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2c660 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  !=CURSOR_VALID |
2c670 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  | (pIdxKey==0)==
2c680 28 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  (pCur->curIntKey
2c690 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  !=0) );..  /* If
2c6a0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
2c6b0 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
2c6c0 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
2c6d0 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
2c6e0 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
2c6f0 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
2c700 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
2c710 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
2c720 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26 20  IdxKey==0.   && 
2c730 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2c740 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70  RSOR_VALID && (p
2c750 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2c760 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21  BTCF_ValidNKey)!
2c770 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  =0.  ){.    if( 
2c780 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
2c790 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
2c7a0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2c7b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c7c0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2c7d0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
2c7e0 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
2c7f0 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
2c800 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
2c810 61 73 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ast)!=0 ){.     
2c820 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
2c830 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2c840 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2c850 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
2c860 20 72 65 71 75 65 73 74 65 64 20 6b 65 79 20 69   requested key i
2c870 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20  s one more than 
2c880 74 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65 79  the previous key
2c890 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
2c8a0 74 72 79 20 74 6f 20 67 65 74 20 74 68 65 72 65  try to get there
2c8b0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 42 74   using sqlite3Bt
2c8c0 72 65 65 4e 65 78 74 28 29 20 72 61 74 68 65 72  reeNext() rather
2c8d0 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20 20   than a full.   
2c8e0 20 20 20 2a 2a 20 62 69 6e 61 72 79 20 73 65 61     ** binary sea
2c8f0 72 63 68 2e 20 20 54 68 69 73 20 69 73 20 61 6e  rch.  This is an
2c900 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e   optimization on
2c910 6c 79 2e 20 20 54 68 65 20 63 6f 72 72 65 63 74  ly.  The correct
2c920 20 61 6e 73 77 65 72 0a 20 20 20 20 20 20 2a 2a   answer.      **
2c930 20 69 73 20 73 74 69 6c 6c 20 6f 62 74 61 69 6e   is still obtain
2c940 65 64 20 77 69 74 68 6f 75 74 20 74 68 69 73 20  ed without this 
2c950 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69 74  case, only a lit
2c960 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c 79  tle more slowely
2c970 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43   */.      if( pC
2c980 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d  ur->info.nKey+1=
2c990 3d 69 6e 74 4b 65 79 20 26 26 20 21 70 43 75 72  =intKey && !pCur
2c9a0 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
2c9b0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2c9c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2c9d0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
2c9e0 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Cur, 0);.       
2c9f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ca00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2ca10 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
2ca20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2ca30 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2ca40 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
2ca50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2ca60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2ca70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2ca80 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2ca90 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
2caa0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2cab0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
2cac0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65  se{.          re
2cad0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2cae0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2caf0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78  .  }..  if( pIdx
2cb00 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f  Key ){.    xReco
2cb10 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69  rdCompare = sqli
2cb20 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
2cb30 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  re(pIdxKey);.   
2cb40 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64   pIdxKey->errCod
2cb50 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  e = 0;.    asser
2cb60 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  t( pIdxKey->defa
2cb70 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20  ult_rc==1 .     
2cb80 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
2cb90 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20  default_rc==0 . 
2cba0 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
2cbb0 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2cbc0 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  -1.    );.  }els
2cbd0 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  e{.    xRecordCo
2cbe0 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c  mpare = 0; /* Al
2cbf0 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67  l keys are integ
2cc00 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63  ers */.  }..  rc
2cc10 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2cc20 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
2cc30 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2cc40 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20  ITE_EMPTY ){.   
2cc50 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2cc60 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2cc70 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2cc80 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
2cc90 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
2cca0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ccb0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
2ccc0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2ccd0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
2cce0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
2ccf0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e  Cur->pPage->isIn
2cd00 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
2cd10 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2cd20 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2cd30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
2cd40 61 67 65 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29  age->nCell > 0 )
2cd50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2cd60 2d 3e 69 50 61 67 65 3d 3d 30 20 7c 7c 20 70 43  ->iPage==0 || pC
2cd70 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
2cd80 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72  ntKey==pCur->cur
2cd90 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  IntKey );.  asse
2cda0 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
2cdb0 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
2cdc0 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
2cdd0 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
2cde0 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
2cdf0 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
2ce00 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2ce10 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 75 38  r->pPage;.    u8
2ce20 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
2ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce40 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2ce50 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
2ce60 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pPage */..    /*
2ce70 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
2ce80 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
2ce90 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
2cea0 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
2ceb0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
2cec0 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
2ced0 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
2cee0 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
2cef0 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
2cf00 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
2cf10 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
2cf20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
2cf30 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
2cf40 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
2cf50 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
2cf60 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
2cf70 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
2cf80 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
2cf90 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
2cfa0 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
2cfb0 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
2cfc0 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
2cfd0 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
2cfe0 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
2cff0 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
2d000 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
2d010 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
2d020 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2d030 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
2d040 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2d050 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
2d060 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
2d070 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
2d080 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
2d090 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61  .    assert( bia
2d0a0 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61  sRight==0 || bia
2d0b0 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20  sRight==1 );.   
2d0c0 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62   idx = upr>>(1-b
2d0d0 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64  iasRight); /* id
2d0e0 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20  x = biasRight ? 
2d0f0 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f  upr : (lwr+upr)/
2d100 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e  2; */.    pCur->
2d110 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
2d120 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f     if( xRecordCo
2d130 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mpare==0 ){.    
2d140 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
2d150 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
2d160 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2d170 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2d180 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20  (pPage, idx);.  
2d190 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
2d1a0 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20  >intKeyLeaf ){. 
2d1b0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
2d1c0 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b  0x80 <= *(pCell+
2d1d0 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
2d1e0 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61    if( pCell>=pPa
2d1f0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a  ge->aDataEnd ){.
2d200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
2d210 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2d220 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
2d230 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2d240 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d250 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
2d260 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
2d270 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
2d280 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2d290 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
2d2a0 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2d2b0 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx+1;.          
2d2c0 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2d2d0 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = -1; break; }.
2d2e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2d2f0 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
2d300 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  y ){.          u
2d310 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
2d320 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
2d330 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65  r ){ c = +1; bre
2d340 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
2d350 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2d360 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d  ssert( nCellKey=
2d370 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  =intKey );.     
2d380 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20       pCur->ix = 
2d390 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2d3a0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2d3b0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
2d3c0 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20      lwr = idx;. 
2d3d0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2d3e0 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2d3f0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  r;.          }el
2d400 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2d410 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2d420 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
2d430 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
2d440 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
2d450 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
2d460 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
2d470 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
2d480 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2d490 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2d4a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d4b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2d4c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2d4d0 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d  ssert( lwr+upr>=
2d4e0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78  0 );.        idx
2d4f0 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b   = (lwr+upr)>>1;
2d500 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b    /* idx = (lwr+
2d510 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20  upr)/2; */.     
2d520 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2d530 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
2d540 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20       int nCell; 
2d550 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
2d560 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79  pCell cell in by
2d570 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  tes */.        p
2d580 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50  Cell = findCellP
2d590 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64  astPtr(pPage, id
2d5a0 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  x);..        /* 
2d5b0 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
2d5c0 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
2d5d0 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
2d5e0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
2d5f0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
2d600 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
2d610 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
2d620 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
2d630 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
2d640 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
2d650 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
2d660 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
2d670 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
2d680 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
2d690 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
2d6a0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
2d6b0 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
2d6c0 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
2d6d0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
2d6e0 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
2d6f0 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
2d700 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
2d710 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
2d720 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
2d730 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
2d740 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
2d750 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
2d760 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
2d770 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
2d780 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d790 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
2d7a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
2d7b0 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31  ell<=pPage->max1
2d7c0 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20  bytePayload ){. 
2d7d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
2d7e0 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
2d7f0 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
2d800 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
2d810 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
2d820 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
2d830 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
2d840 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
2d850 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
2d860 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
2d870 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
2d880 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2d890 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
2d8a0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
2d8b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
2d8c0 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
2d8d0 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
2d8e0 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
2d8f0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
2d900 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
2d910 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
2d920 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
2d930 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
2d940 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
2d950 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
2d960 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2d970 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
2d980 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
2d990 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
2d9a0 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
2d9b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
2d9c0 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
2d9d0 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
2d9e0 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
2d9f0 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
2da00 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65  l+nCell+2==pPage
2da10 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
2da20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2da30 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2da40 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
2da50 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  2], pIdxKey);.  
2da60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2da70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2da80 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20  cord flows over 
2da90 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  onto one or more
2daa0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
2dab0 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   In.          **
2dac0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77   this case the w
2dad0 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20  hole cell needs 
2dae0 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20  to be parsed, a 
2daf0 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
2db00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
2db10 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  d accessPayload(
2db20 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65  ) used to retrie
2db30 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  ve the record in
2db40 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  to the.         
2db50 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72   ** buffer befor
2db60 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
2db70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c  are() can be cal
2db80 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20  led. .          
2db90 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  **.          ** 
2dba0 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
2dbb0 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52   corrupt, the xR
2dbc0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75  ecordCompare rou
2dbd0 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20  tine may read.  
2dbe0 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f          ** up to
2dbf0 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73   two varints pas
2dc00 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2dc10 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72   buffer. An extr
2dc20 61 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20  a 18 .          
2dc30 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  ** bytes of padd
2dc40 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ing is allocated
2dc50 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
2dc60 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20  he buffer in.   
2dc70 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
2dc80 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f  his happens.  */
2dc90 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
2dca0 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
2dcb0 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
2dcc0 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
2dcd0 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
2dce0 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
2dcf0 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
2dd00 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
2dd10 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e  lBody, &pCur->in
2dd20 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  fo);.          n
2dd30 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72  Cell = (int)pCur
2dd40 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
2dd50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2dd60 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a   nCell<0 );   /*
2dd70 20 54 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a   True if key siz
2dd80 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72  e is 2^32 or mor
2dd90 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  e */.          t
2dda0 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
2ddb0 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64  0 );  /* Invalid
2ddc0 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30   key size:  0x80
2ddd0 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20   0x80 0x00 */.  
2dde0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2ddf0 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f  ( nCell==1 );  /
2de00 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69  * Invalid key si
2de10 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30  ze:  0x80 0x80 0
2de20 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  x01 */.         
2de30 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2de40 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  ==2 );  /* Minim
2de50 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b  um legal index k
2de60 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  ey size */.     
2de70 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32       if( nCell<2
2de80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2de90 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2dea0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
2deb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2dec0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2ded0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2dee0 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
2def0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
2df00 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20   nCell+18 );.   
2df10 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
2df20 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
2df30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2df40 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2df50 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2df60 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2df70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2df80 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2df90 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2dfa0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
2dfb0 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
2dfc0 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
2dfd0 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
2dfe0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  0);.          pC
2dff0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2e000 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b  ~BTCF_ValidOvfl;
2e010 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2e020 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
2e030 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2e040 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2e050 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2e060 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2e070 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
2e080 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2e090 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65  e(nCell, pCellKe
2e0a0 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
2e0b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2e0c0 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2e0d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e0e0 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
2e0f0 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e        (pIdxKey->
2e100 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2e110 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29  CORRUPT || c==0)
2e120 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49  .         && (pI
2e130 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d  dxKey->errCode!=
2e140 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
2e150 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2e160 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a  ->mallocFailed).
2e170 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
2e180 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
2e190 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
2e1a0 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x+1;.        }el
2e1b0 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20  se if( c>0 ){.  
2e1c0 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
2e1d0 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  x-1;.        }el
2e1e0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
2e1f0 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20  sert( c==0 );.  
2e200 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2e210 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
2e220 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2e230 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20         pCur->ix 
2e240 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2e250 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65        if( pIdxKe
2e260 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20  y->errCode ) rc 
2e270 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2e280 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2e290 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2e2a0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ish;.        }. 
2e2b0 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
2e2c0 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  pr ) break;.    
2e2d0 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
2e2e0 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
2e2f0 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
2e300 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
2e310 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20  (lwr+upr)/2 */. 
2e320 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2e330 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
2e340 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69  r+1 || (pPage->i
2e350 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
2e360 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73  >leaf) );.    as
2e370 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2e380 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nit );.    if( p
2e390 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2e3a0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2e3b0 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  ->ix<pCur->pPage
2e3c0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
2e3d0 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2e3e0 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65  )idx;.      *pRe
2e3f0 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
2e400 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2e410 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2e420 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76  inish;.    }.mov
2e430 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a  eto_next_layer:.
2e440 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61      if( lwr>=pPa
2e450 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2e460 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
2e470 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2e480 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2e490 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
2e4a0 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67  se{.      chldPg
2e4b0 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
2e4c0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29  Cell(pPage, lwr)
2e4d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  );.    }.    pCu
2e4e0 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 6c 77 72  r->ix = (u16)lwr
2e4f0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2e500 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
2e510 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
2e520 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f   ) break;.  }.mo
2e530 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70  veto_finish:.  p
2e540 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2e550 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28  = 0;.  assert( (
2e560 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2e570 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
2e580 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
2e590 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
2e5a0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2e5b0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
2e5c0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2e5d0 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
2e5e0 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
2e5f0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
2e600 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
2e610 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2e620 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
2e630 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2e640 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
2e650 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
2e660 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
2e670 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
2e680 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
2e690 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
2e6a0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2e6b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2e6c0 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
2e6d0 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
2e6e0 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
2e6f0 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
2e700 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
2e710 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
2e720 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
2e730 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
2e740 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
2e750 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
2e760 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
2e770 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
2e780 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
2e790 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
2e7a0 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
2e7b0 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
2e7c0 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ate);.}../*.** R
2e7d0 65 74 75 72 6e 20 61 6e 20 65 73 74 69 6d 61 74  eturn an estimat
2e7e0 65 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72  e for the number
2e7f0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
2e800 74 61 62 6c 65 20 74 68 61 74 20 70 43 75 72 20  table that pCur 
2e810 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  is.** pointing t
2e820 6f 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 67  o.  Return a neg
2e830 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66 20  ative number if 
2e840 6e 6f 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  no estimate is c
2e850 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 61 76 61  urrently .** ava
2e860 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73  ilable..*/.i64 s
2e870 71 6c 69 74 65 33 42 74 72 65 65 52 6f 77 43 6f  qlite3BtreeRowCo
2e880 75 6e 74 45 73 74 28 42 74 43 75 72 73 6f 72 20  untEst(BtCursor 
2e890 2a 70 43 75 72 29 7b 0a 20 20 69 36 34 20 6e 3b  *pCur){.  i64 n;
2e8a0 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61 73 73 65  .  u8 i;..  asse
2e8b0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2e8c0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2e8d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2e8e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2e8f0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2e900 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  utex) );..  /* C
2e910 75 72 72 65 6e 74 6c 79 20 74 68 69 73 20 69 6e  urrently this in
2e920 74 65 72 66 61 63 65 20 69 73 20 6f 6e 6c 79 20  terface is only 
2e930 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 4f 50  called by the OP
2e940 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20  _IfSmaller.  ** 
2e950 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69 74 20 74  opcode, and it t
2e960 68 61 74 20 63 61 73 65 20 74 68 65 20 63 75 72  hat case the cur
2e970 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  sor will always 
2e980 62 65 20 76 61 6c 69 64 20 61 6e 64 0a 20 20 2a  be valid and.  *
2e990 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 70 6f  * will always po
2e9a0 69 6e 74 20 74 6f 20 61 20 6c 65 61 66 20 6e 6f  int to a leaf no
2e9b0 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  de. */.  if( NEV
2e9c0 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65 21  ER(pCur->eState!
2e9d0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29  =CURSOR_VALID) )
2e9e0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69 66   return -1;.  if
2e9f0 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 70 50  ( NEVER(pCur->pP
2ea00 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 20 29 20  age->leaf==0) ) 
2ea10 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 6e 20  return -1;..  n 
2ea20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  = pCur->pPage->n
2ea30 43 65 6c 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Cell;.  for(i=0;
2ea40 20 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20   i<pCur->iPage; 
2ea50 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a 3d 20 70  i++){.    n *= p
2ea60 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e  Cur->apPage[i]->
2ea70 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65 74  nCell;.  }.  ret
2ea80 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
2ea90 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
2eaa0 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
2eab0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2eac0 62 61 73 65 2e 20 0a 2a 2a 20 52 65 74 75 72 6e  base. .** Return
2ead0 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   value:.**.**   
2eae0 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20   SQLITE_OK      
2eaf0 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20 20    success.**    
2eb00 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 20 20  SQLITE_DONE     
2eb10 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
2eb20 64 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  dy pointing at t
2eb30 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74 0a  he last element.
2eb40 2a 2a 20 20 20 20 6f 74 68 65 72 77 69 73 65 20  **    otherwise 
2eb50 20 20 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64         some kind
2eb60 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72   of error occurr
2eb70 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  ed.**.** The mai
2eb80 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
2eb90 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2eba0 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69  t().  That routi
2ebb0 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a  ne is optimized.
2ebc0 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ** for the commo
2ebd0 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79  n case of merely
2ebe0 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   incrementing th
2ebf0 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42  e cell counter B
2ec00 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a  tCursor.aiIdx.**
2ec10 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c   to the next cel
2ec20 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  l on the current
2ec30 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f   page.  The (slo
2ec40 77 65 72 29 20 62 74 72 65 65 4e 65 78 74 28 29  wer) btreeNext()
2ec50 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69   helper.** routi
2ec60 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2ec70 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
2ec80 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
2ec90 69 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72  ifferent page or
2eca0 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74  .** to restore t
2ecb0 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
2ecc0 20 49 66 20 62 69 74 20 30 78 30 31 20 6f 66 20   If bit 0x01 of 
2ecd0 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20 69  the F argument i
2ece0 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  n sqlite3BtreeNe
2ecf0 78 74 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68  xt(C,F) is 1, th
2ed00 65 6e 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  en the.** cursor
2ed10 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2ed20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2ed30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
2ed40 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  uld have been.**
2ed50 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
2ed60 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
2ed70 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  en a unique inde
2ed80 78 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d 65  x.  The F argume
2ed90 6e 74 0a 2a 2a 20 69 73 20 61 20 68 69 6e 74 20  nt.** is a hint 
2eda0 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
2edb0 2e 20 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  .  SQLite btree 
2edc0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2edd0 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 74  oes not use.** t
2ede0 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43 4f  his hint, but CO
2edf0 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74  MDB2 does..*/.st
2ee00 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
2ee10 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65  LINE int btreeNe
2ee20 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2ee30 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
2ee40 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
2ee50 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2ee60 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2ee70 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2ee80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2ee90 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2eea0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2eeb0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2eec0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2eed0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2eee0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
2eef0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2ef00 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
2ef10 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
2ef20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2ef30 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
2ef40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ef50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2ef60 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2ef70 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2ef80 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2ef90 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
2efa0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
2efb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2efc0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2efd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2efe0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2eff0 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2f000 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2f010 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2f020 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2f030 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2f040 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2f050 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20  kipNext>0 ){.   
2f060 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2f070 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2f080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f090 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2f0a0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2f0b0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2f0c0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2f0d0 70 50 61 67 65 3b 0a 20 20 69 64 78 20 3d 20 2b  pPage;.  idx = +
2f0e0 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20 61 73 73  +pCur->ix;.  ass
2f0f0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2f100 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  it );..  /* If t
2f110 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f120 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20   is corrupt, it 
2f130 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
2f140 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78  the value of idx
2f150 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76   .  ** to be inv
2f160 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20  alid here. This 
2f170 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69  can only occur i
2f180 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f  f a second curso
2f190 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20  r modifies.  ** 
2f1a0 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63  the page while c
2f1b0 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f  ursor pCur is ho
2f1c0 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63  lding a referenc
2f1d0 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63  e to it. Which c
2f1e0 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70  an.  ** only hap
2f1f0 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62  pen if the datab
2f200 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69  ase is corrupt i
2f210 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20  n such a way as 
2f220 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a  to link the.  **
2f230 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20   page into more 
2f240 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20  than one b-tree 
2f250 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
2f260 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50  testcase( idx>pP
2f270 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
2f280 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
2f290 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
2f2a0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2f2b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
2f2c0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
2f2d0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2f2e0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2f2f0 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
2f300 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2f310 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74  rn rc;.      ret
2f320 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
2f330 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
2f340 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
2f350 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
2f360 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
2f370 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2f380 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
2f390 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f3a0 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
2f3b0 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
2f3c0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
2f3d0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2f3e0 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  ge;.    }while( 
2f3f0 70 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d  pCur->ix>=pPage-
2f400 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66  >nCell );.    if
2f410 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2f420 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2f430 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2f440 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d  (pCur, 0);.    }
2f450 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
2f460 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2f470 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
2f480 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2f490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f4a0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2f4b0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2f4c0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2f4d0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2f4e0 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2f4f0 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67   *pCur, int flag
2f500 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  s){.  MemPage *p
2f510 50 61 67 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Page;.  UNUSED_P
2f520 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73 20  ARAMETER( flags 
2f530 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20 43  );  /* Used in C
2f540 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e 61  OMDB2 but not na
2f550 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20  tive SQLite */. 
2f560 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2f570 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2f580 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ) );.  assert( f
2f590 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
2f5a0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
2f5b0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2f5c0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2f5d0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2f5e0 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
2f5f0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2f600 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2f610 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2f620 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2f630 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( 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 20 72 65 74 75 72 6e 20 62 74 72 65  ID ) return btre
2f660 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20 70  eNext(pCur);.  p
2f670 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2f680 67 65 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43 75  ge;.  if( (++pCu
2f690 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e  r->ix)>=pPage->n
2f6a0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75 72  Cell ){.    pCur
2f6b0 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75  ->ix--;.    retu
2f6c0 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75  rn btreeNext(pCu
2f6d0 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  r);.  }.  if( pP
2f6e0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2f6f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f700 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2f710 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2f720 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2f730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  .}../*.** Step t
2f740 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2f750 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
2f760 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
2f770 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
2f780 52 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a  Return values:.*
2f790 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
2f7a0 4f 4b 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a  OK     success.*
2f7b0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e  *     SQLITE_DON
2f7c0 45 20 20 20 74 68 65 20 63 75 72 73 6f 72 20 69  E   the cursor i
2f7d0 73 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68 65  s already on the
2f7e0 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f   first element o
2f7f0 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20  f the table.**  
2f800 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20     otherwise    
2f810 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72   some kind of er
2f820 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a  ror occurred.**.
2f830 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
2f840 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
2f850 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
2f860 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65  ).  That routine
2f870 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a   is optimized.**
2f880 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
2f890 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64  case of merely d
2f8a0 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ecrementing the 
2f8b0 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43  cell counter BtC
2f8c0 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74  ursor.aiIdx.** t
2f8d0 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  o the previous c
2f8e0 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65  ell on the curre
2f8f0 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73  nt page.  The (s
2f900 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76  lower) btreePrev
2f910 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72  ious().** helper
2f920 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2f930 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65  ed when it is ne
2f940 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20  cessary to move 
2f950 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
2f960 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73  age.** or to res
2f970 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e  tore the cursor.
2f980 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78  .**.** If bit 0x
2f990 30 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75  01 of the F argu
2f9a0 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42  ment to sqlite3B
2f9b0 74 72 65 65 50 72 65 76 69 6f 75 73 28 43 2c 46  treePrevious(C,F
2f9c0 29 20 69 73 20 31 2c 20 74 68 65 6e 0a 2a 2a 20  ) is 1, then.** 
2f9d0 74 68 65 20 63 75 72 73 6f 72 20 63 6f 72 72 65  the cursor corre
2f9e0 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
2f9f0 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20   index and this 
2fa00 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
2fa10 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70  ve been.** skipp
2fa20 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e  ed if the SQL in
2fa30 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75  dex had been a u
2fa40 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68  nique index.  Th
2fa50 65 20 46 20 61 72 67 75 6d 65 6e 74 20 69 73 20  e F argument is 
2fa60 61 0a 2a 2a 20 68 69 6e 74 20 74 6f 20 74 68 65  a.** hint to the
2fa70 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 54 68 65   implement.  The
2fa80 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 62   native SQLite b
2fa90 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2faa0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ion does not.** 
2fab0 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 62  use this hint, b
2fac0 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a  ut COMDB2 does..
2fad0 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2fae0 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2faf0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2fb00 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
2fb10 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
2fb20 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2fb30 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2fb40 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2fb50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2fb60 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2fb70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2fb80 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2fb90 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2fba0 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41  rFlags & (BTCF_A
2fbb0 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
2fbc0 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Ovfl|BTCF_ValidN
2fbd0 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  Key))==0 );.  as
2fbe0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2fbf0 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69  .nSize==0 );.  i
2fc00 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2fc10 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
2fc20 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
2fc30 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2fc40 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2fc50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2fc60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2fc70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
2fc80 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2fc90 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2fca0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2fcb0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
2fcc0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2fcd0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61  pNext ){.      a
2fce0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2fcf0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2fd00 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
2fd10 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
2fd20 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  XT );.      pCur
2fd30 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2fd40 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69  R_VALID;.      i
2fd50 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2fd60 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  t<0 ){.        p
2fd70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2fd80 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
2fd90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2fda0 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
2fdb0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2fdc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
2fdd0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2fde0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2fdf0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
2fe00 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2fe10 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
2fe20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63  pCur->ix;.    rc
2fe30 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2fe40 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
2fe50 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
2fe60 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
2fe70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2fe80 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
2fe90 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
2fea0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
2feb0 28 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b  ( pCur->ix==0 ){
2fec0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2fed0 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
2fee0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2fef0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2ff00 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
2ff10 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
2ff20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
2ff30 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
2ff40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2ff50 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2ff60 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
2ff70 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2ff80 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56  rFlags & (BTCF_V
2ff90 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b  alidOvfl))==0 );
2ffa0 0a 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d  ..    pCur->ix--
2ffb0 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
2ffc0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69  ur->pPage;.    i
2ffd0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2ffe0 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
2fff0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
30000 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
30010 6f 75 73 28 70 43 75 72 2c 20 30 29 3b 0a 20 20  ous(pCur, 0);.  
30020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
30030 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
30040 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
30050 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
30060 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
30070 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
30080 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 61   int flags){.  a
30090 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
300a0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
300b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
300c0 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
300d0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
300e0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
300f0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
30100 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
30110 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
30120 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20  ETER( flags );  
30130 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42  /* Used in COMDB
30140 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65  2 but not native
30150 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 70 43 75   SQLite */.  pCu
30160 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
30170 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
30180 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
30190 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70  _ValidNKey);.  p
301a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
301b0 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
301c0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
301d0 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72  VALID.   || pCur
301e0 2d 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20 70 43  ->ix==0.   || pC
301f0 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d  ur->pPage->leaf=
30200 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
30210 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  rn btreePrevious
30220 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 43  (pCur);.  }.  pC
30230 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75  ur->ix--;.  retu
30240 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
30250 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
30260 45 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 0a 23  ERVER_EDITION..#
30270 64 65 66 69 6e 65 20 53 45 52 56 45 52 5f 44 45  define SERVER_DE
30280 46 41 55 4c 54 5f 46 52 45 45 4c 49 53 54 53 20  FAULT_FREELISTS 
30290 20 20 20 20 20 31 36 0a 23 64 65 66 69 6e 65 20       16.#define 
302a0 53 45 52 56 45 52 5f 44 45 46 41 55 4c 54 5f 46  SERVER_DEFAULT_F
302b0 52 45 45 4c 49 53 54 5f 53 49 5a 45 20 31 32 38  REELIST_SIZE 128
302c0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
302d0 20 74 68 65 20 66 72 65 65 2d 6e 6f 64 65 20 61   the free-node a
302e0 6e 64 20 74 68 65 20 66 69 72 73 74 20 53 45 52  nd the first SER
302f0 56 45 52 5f 44 45 46 41 55 4c 54 5f 46 52 45 45  VER_DEFAULT_FREE
30300 4c 49 53 54 53 20 0a 2a 2a 20 74 72 75 6e 6b 20  LISTS .** trunk 
30310 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  pages..*/.static
30320 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 65 72   int allocateSer
30330 76 65 72 46 72 65 65 6e 6f 64 65 28 42 74 53 68  verFreenode(BtSh
30340 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
30350 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
30360 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
30370 50 61 67 65 31 3b 0a 0a 20 20 72 63 20 3d 20 73  Page1;..  rc = s
30380 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30390 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
303a0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
303b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67  ITE_OK ){.    Pg
303c0 6e 6f 20 70 67 6e 6f 4e 6f 64 65 20 3d 20 28 2b  no pgnoNode = (+
303d0 2b 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20  +pBt->nPage);.  
303e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 6f 64 65    MemPage *pNode
303f0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b   = 0;.    int i;
30400 0a 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ..    put4byte(&
30410 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
30420 5d 2c 20 70 67 6e 6f 4e 6f 64 65 29 3b 0a 20 20  ], pgnoNode);.  
30430 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
30440 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70  nusedPage(pBt, p
30450 67 6e 6f 4e 6f 64 65 2c 20 26 70 4e 6f 64 65 2c  gnoNode, &pNode,
30460 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
30470 54 45 4e 54 29 3b 0a 20 20 20 20 69 66 28 20 72  TENT);.    if( r
30480 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30490 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
304a0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 6f  e3PagerWrite(pNo
304b0 64 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  de->pDbPage);.  
304c0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
304d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
304e0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 6f     put4byte(&pNo
304f0 64 65 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 30 29  de->aData[0], 0)
30500 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
30510 28 26 70 4e 6f 64 65 2d 3e 61 44 61 74 61 5b 34  (&pNode->aData[4
30520 5d 2c 20 53 45 52 56 45 52 5f 44 45 46 41 55 4c  ], SERVER_DEFAUL
30530 54 5f 46 52 45 45 4c 49 53 54 53 29 3b 0a 20 20  T_FREELISTS);.  
30540 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
30550 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
30560 26 20 69 3c 53 45 52 56 45 52 5f 44 45 46 41 55  & i<SERVER_DEFAU
30570 4c 54 5f 46 52 45 45 4c 49 53 54 53 3b 20 69 2b  LT_FREELISTS; i+
30580 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67  +){.      MemPag
30590 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
305a0 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 54 72       Pgno pgnoTr
305b0 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 2b  unk;.      if( +
305c0 2b 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e  +pBt->nPage==PEN
305d0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
305e0 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65  Bt) ) pBt->nPage
305f0 2b 2b 3b 0a 20 20 20 20 20 20 70 67 6e 6f 54 72  ++;.      pgnoTr
30600 75 6e 6b 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65  unk = pBt->nPage
30610 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  ;..      rc = bt
30620 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
30630 28 70 42 74 2c 20 70 67 6e 6f 54 72 75 6e 6b 2c  (pBt, pgnoTrunk,
30640 20 26 70 54 72 75 6e 6b 2c 20 50 41 47 45 52 5f   &pTrunk, PAGER_
30650 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a  GET_NOCONTENT);.
30660 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30670 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30680 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
30690 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
306a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
306b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
306c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
306d0 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54         memset(pT
306e0 72 75 6e 6b 2d 3e 61 44 61 74 61 2c 20 30 2c 20  runk->aData, 0, 
306f0 38 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  8);.        put4
30700 62 79 74 65 28 26 70 4e 6f 64 65 2d 3e 61 44 61  byte(&pNode->aDa
30710 74 61 5b 38 2b 69 2a 34 5d 2c 20 70 67 6e 6f 54  ta[8+i*4], pgnoT
30720 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  runk);.      }. 
30730 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
30740 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 7d 0a  (pTrunk);.    }.
30750 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30760 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  pNode);.  }..  r
30770 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
30780 2a 2a 20 52 65 74 75 72 6e 20 61 20 72 65 66 65  ** Return a refe
30790 72 65 6e 63 65 20 74 6f 20 74 68 65 20 66 69 72  rence to the fir
307a0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
307b0 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 61 74 61   one of the data
307c0 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 73 2e  base free-lists.
307d0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65  .** Allocate the
307e0 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c   database free-l
307f0 69 73 74 73 20 69 66 20 72 65 71 75 69 72 65 64  ists if required
30800 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30810 66 69 6e 64 53 65 72 76 65 72 54 72 75 6e 6b 28  findServerTrunk(
30820 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
30830 6e 74 20 62 41 6c 6c 6f 63 2c 20 4d 65 6d 50 61  nt bAlloc, MemPa
30840 67 65 20 2a 2a 70 70 54 72 75 6e 6b 29 7b 0a 20  ge **ppTrunk){. 
30850 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
30860 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
30870 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 6f 64 65    MemPage *pNode
30880 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
30890 20 20 2f 2a 20 54 68 65 20 6e 6f 64 65 20 70 61    /* The node pa
308a0 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ge */.  MemPage 
308b0 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20  *pTrunk = 0;    
308c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
308d0 65 74 75 72 6e 65 64 20 70 61 67 65 20 2a 2f 0a  eturned page */.
308e0 20 20 50 67 6e 6f 20 69 4e 6f 64 65 3b 20 20 20    Pgno iNode;   
308f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30900 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
30910 20 6f 66 20 6e 6f 64 65 20 70 61 67 65 20 2a 2f   of node page */
30920 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
30930 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20  TE_OK;..  /* If 
30940 74 68 65 20 6e 6f 64 65 20 70 61 67 65 20 61 6e  the node page an
30950 64 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  d free-list trun
30960 6b 73 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  ks have not yet 
30970 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
30980 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68  allocate.  ** th
30990 65 6d 20 6e 6f 77 2e 20 20 2a 2f 0a 20 20 70 50  em now.  */.  pP
309a0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
309b0 65 31 3b 0a 20 20 69 4e 6f 64 65 20 3d 20 67 65  e1;.  iNode = ge
309c0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
309d0 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 69 66  aData[32]);.  if
309e0 28 20 69 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ( iNode==0 ){.  
309f0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53    rc = allocateS
30a00 65 72 76 65 72 46 72 65 65 6e 6f 64 65 28 70 42  erverFreenode(pB
30a10 74 29 3b 0a 20 20 20 20 69 4e 6f 64 65 20 3d 20  t);.    iNode = 
30a20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
30a30 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
30a40 7d 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65  }..  /* Grab the
30a50 20 6e 6f 64 65 20 70 61 67 65 20 2a 2f 0a 20 20   node page */.  
30a60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30a70 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
30a80 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
30a90 28 70 42 74 2c 20 69 4e 6f 64 65 2c 20 26 70 4e  (pBt, iNode, &pN
30aa0 6f 64 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ode, 0);.  }.  i
30ab0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30ac0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 69 73   ){.    int nLis
30ad0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
30ae0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
30af0 6f 66 20 66 72 65 65 2d 6c 69 73 74 73 20 69 6e  of free-lists in
30b00 20 74 68 69 73 20 64 62 20 2a 2f 0a 20 20 20 20   this db */.    
30b10 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 54  int i;..    /* T
30b20 72 79 20 74 6f 20 6c 6f 63 6b 20 61 20 66 72 65  ry to lock a fre
30b30 65 2d 6c 69 73 74 20 74 72 75 6e 6b 2e 20 49 66  e-list trunk. If
30b40 20 62 41 6c 6c 6f 63 20 69 73 20 74 72 75 65 2c   bAlloc is true,
30b50 20 69 74 20 68 61 73 20 74 6f 20 62 65 20 61 0a   it has to be a.
30b60 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
30b70 20 74 72 75 6e 6b 20 77 69 74 68 20 61 74 20 6c   trunk with at l
30b80 65 61 73 74 20 6f 6e 65 20 65 6e 74 72 79 20 69  east one entry i
30b90 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
30ba0 20 2a 2f 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20   */.    nList = 
30bb0 28 69 6e 74 29 67 65 74 34 62 79 74 65 28 26 70  (int)get4byte(&p
30bc0 4e 6f 64 65 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  Node->aData[4]);
30bd0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
30be0 6e 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  nList; i++){.   
30bf0 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d     Pgno iTrunk =
30c00 20 67 65 74 34 62 79 74 65 28 26 70 4e 6f 64 65   get4byte(&pNode
30c10 2d 3e 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b  ->aData[8+i*4]);
30c20 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
30c30 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 50 61 67  E_OK==sqlite3Pag
30c40 65 72 50 61 67 65 6c 6f 63 6b 28 70 42 74 2d 3e  erPagelock(pBt->
30c50 70 50 61 67 65 72 2c 20 69 54 72 75 6e 6b 2c 20  pPager, iTrunk, 
30c60 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
30c70 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
30c80 64 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  dPage(pBt, iTrun
30c90 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
30ca0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
30cb0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 41 6c  SQLITE_OK && bAl
30cc0 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  loc ){.         
30cd0 20 69 66 28 20 21 67 65 74 34 62 79 74 65 28 26   if( !get4byte(&
30ce0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
30cf0 29 20 26 26 20 21 67 65 74 34 62 79 74 65 28 26  ) && !get4byte(&
30d00 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
30d10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
30d20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
30d30 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
30d40 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
30d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30d60 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
30d70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
30d80 20 70 54 72 75 6e 6b 20 29 20 62 72 65 61 6b 3b   pTrunk ) break;
30d90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
30da0 20 20 20 20 2f 2a 20 4e 6f 20 66 72 65 65 20 70      /* No free p
30db0 61 67 65 73 20 69 6e 20 61 6e 79 20 66 72 65 65  ages in any free
30dc0 2d 6c 69 73 74 2e 20 4f 72 20 70 65 72 68 61 70  -list. Or perhap
30dd0 73 20 77 65 20 77 65 72 65 20 6c 6f 63 6b 65 64  s we were locked
30de0 20 6f 75 74 2e 20 49 6e 20 0a 20 20 20 20 2a 2a   out. In .    **
30df0 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 72   either case, tr
30e00 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 6f  y to allocate mo
30e10 72 65 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  re from the end 
30e20 6f 66 20 74 68 65 20 66 69 6c 65 20 6e 6f 77 2e  of the file now.
30e30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d    */.    if( i==
30e40 6e 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61  nList ){.      a
30e50 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
30e60 45 5f 4f 4b 20 26 26 20 70 54 72 75 6e 6b 3d 3d  E_OK && pTrunk==
30e70 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
30e80 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30e90 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
30ea0 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  e);.      for(i=
30eb0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
30ec0 20 26 26 20 69 3c 6e 4c 69 73 74 3b 20 69 2b 2b   && i<nList; i++
30ed0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ){.        /* Ad
30ee0 64 20 73 6f 6d 65 20 66 72 65 65 20 70 61 67 65  d some free page
30ef0 73 20 74 6f 20 65 61 63 68 20 66 72 65 65 2d 6c  s to each free-l
30f00 69 73 74 2e 20 4e 6f 20 73 65 72 76 65 72 2d 6c  ist. No server-l
30f10 6f 63 6b 73 20 61 72 65 20 72 65 71 75 69 72 65  ocks are require
30f20 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  d.        ** to 
30f30 64 6f 20 74 68 69 73 20 61 73 20 77 65 20 68 61  do this as we ha
30f40 76 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ve a write-lock 
30f50 6f 6e 20 70 61 67 65 20 31 20 2d 20 67 75 61 72  on page 1 - guar
30f60 61 6e 74 65 65 69 6e 67 0a 20 20 20 20 20 20 20  anteeing.       
30f70 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63   ** exclusive ac
30f80 63 65 73 73 20 74 6f 20 74 68 65 20 64 62 20 66  cess to the db f
30f90 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ile.  */.       
30fa0 20 4d 65 6d 50 61 67 65 20 2a 70 54 20 3d 20 30   MemPage *pT = 0
30fb0 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
30fc0 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
30fd0 28 26 70 4e 6f 64 65 2d 3e 61 44 61 74 61 5b 38  (&pNode->aData[8
30fe0 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*4]);.        
30ff0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
31000 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 54 72  sedPage(pBt, iTr
31010 75 6e 6b 2c 20 26 70 54 2c 20 30 29 3b 0a 20 20  unk, &pT, 0);.  
31020 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31030 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31040 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31050 33 50 61 67 65 72 57 72 69 74 65 28 70 54 2d 3e  3PagerWrite(pT->
31060 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
31070 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
31080 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31090 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
310a0 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
310b0 54 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  T->aData[4]);.  
310c0 20 20 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e 6f          for(/*no
310d0 2d 6f 70 2a 2f 3b 20 69 50 67 3c 53 45 52 56 45  -op*/; iPg<SERVE
310e0 52 5f 44 45 46 41 55 4c 54 5f 46 52 45 45 4c 49  R_DEFAULT_FREELI
310f0 53 54 5f 53 49 5a 45 3b 20 69 50 67 2b 2b 29 7b  ST_SIZE; iPg++){
31100 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
31110 20 2b 2b 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50   ++pBt->nPage==P
31120 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
31130 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
31140 67 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ge++;.          
31150 20 20 70 75 74 34 62 79 74 65 28 26 70 54 2d 3e    put4byte(&pT->
31160 61 44 61 74 61 5b 38 2b 69 50 67 2a 34 5d 2c 20  aData[8+iPg*4], 
31170 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
31180 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31190 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 2d     put4byte(&pT-
311a0 3e 61 44 61 74 61 5b 34 5d 2c 20 69 50 67 29 3b  >aData[4], iPg);
311b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
311c0 54 72 75 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  Trunk==0 ){.    
311d0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
311e0 20 70 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20   pT;.           
311f0 20 70 54 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   pT = 0;.       
31200 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
31210 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
31220 67 65 28 70 54 29 3b 0a 20 20 20 20 20 20 7d 0a  ge(pT);.      }.
31230 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31240 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31250 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
31260 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
31270 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
31280 65 64 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d  edPage(pBt, pBt-
31290 3e 6e 50 61 67 65 2c 20 26 70 4c 61 73 74 2c 20  >nPage, &pLast, 
312a0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
312b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
312c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
312d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
312e0 65 28 70 4c 61 73 74 2d 3e 70 44 62 50 61 67 65  e(pLast->pDbPage
312f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
31300 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 29 3b  easePage(pLast);
31310 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
31320 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70 50  yte(28 + (u8*)pP
31330 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74  age1->aData, pBt
31340 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
31350 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
31360 7d 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65  }.  }..  release
31370 50 61 67 65 28 70 4e 6f 64 65 29 3b 0a 20 20 69  Page(pNode);.  i
31380 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31390 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
313a0 70 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 72 63  pTrunk );.    rc
313b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
313c0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
313d0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Page);.  }.  if(
313e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
313f0 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
31400 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 70  e(pTrunk);.    p
31410 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 7d 0a 20  Trunk = 0;.  }. 
31420 20 2a 70 70 54 72 75 6e 6b 20 3d 20 70 54 72 75   *ppTrunk = pTru
31430 6e 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  nk;.  return rc;
31440 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .}..static int a
31450 6c 6c 6f 63 61 74 65 53 65 72 76 65 72 50 61 67  llocateServerPag
31460 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
31470 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt,         /* T
31480 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65  he btree */.  Me
31490 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
314a0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f       /* Store po
314b0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c  inter to the all
314c0 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65  ocated page here
314d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
314e0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
314f0 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e  Store the page n
31500 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  umber here */.  
31510 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20  Pgno nearby,    
31520 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
31530 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72   for a page near
31540 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75   this one */.  u
31550 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20  8 eMode         
31560 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43        /* BTALLOC
31570 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f  _EXACT, BTALLOC_
31580 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41  LT, or BTALLOC_A
31590 4e 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  NY */.){.  int r
315a0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
315b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
315c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d  turn code */.  M
315d0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
315e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
315f0 2a 20 54 68 65 20 6e 6f 64 65 20 70 61 67 65 20  * The node page 
31600 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
31610 77 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  w = 0;..#ifdef S
31620 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e  QLITE_DEBUG.  in
31630 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
31640 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
31650 74 2d 3e 70 50 61 67 65 72 29 3b 0a 23 65 6e 64  t->pPager);.#end
31660 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4d  if..  assert( eM
31670 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59  ode==BTALLOC_ANY
31680 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
31690 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
316a0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
316b0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
316c0 20 20 72 63 20 3d 20 66 69 6e 64 53 65 72 76 65    rc = findServe
316d0 72 54 72 75 6e 6b 28 70 42 74 2c 20 31 2c 20 26  rTrunk(pBt, 1, &
316e0 70 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72  pTrunk);.  if( r
316f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31700 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20      int nFree;  
31710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
31720 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61  umber of free pa
31730 67 65 73 20 6f 6e 20 74 68 69 73 20 74 72 75 6e  ges on this trun
31740 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 6e 46  k page */.    nF
31750 72 65 65 20 3d 20 28 69 6e 74 29 67 65 74 34 62  ree = (int)get4b
31760 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
31770 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20  ta[4]);.    if( 
31780 6e 46 72 65 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nFree==0 ){.    
31790 20 20 70 67 6e 6f 4e 65 77 20 3d 20 67 65 74 34    pgnoNew = get4
317a0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
317b0 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 61  ata[0]);.      a
317c0 73 73 65 72 74 28 20 70 67 6e 6f 4e 65 77 20 29  ssert( pgnoNew )
317d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
317e0 20 20 20 6e 46 72 65 65 2d 2d 3b 0a 20 20 20 20     nFree--;.    
317f0 20 20 70 67 6e 6f 4e 65 77 20 3d 20 67 65 74 34    pgnoNew = get4
31800 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
31810 61 74 61 5b 38 2b 34 2a 6e 46 72 65 65 5d 29 3b  ata[8+4*nFree]);
31820 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
31830 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
31840 5d 2c 20 28 75 33 32 29 6e 46 72 65 65 29 3b 0a  ], (u32)nFree);.
31850 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
31860 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  e(pTrunk);.     
31870 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
31880 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
31890 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
318a0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
318b0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
318c0 61 67 73 20 3d 20 70 54 72 75 6e 6b 20 3f 20 30  ags = pTrunk ? 0
318d0 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43   : PAGER_GET_NOC
318e0 4f 4e 54 45 4e 54 3b 0a 20 20 20 20 72 63 20 3d  ONTENT;.    rc =
318f0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
31900 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  age(pBt, pgnoNew
31910 2c 20 26 70 4e 65 77 2c 20 66 6c 61 67 73 29 3b  , &pNew, flags);
31920 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
31930 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31940 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31950 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62  rWrite(pNew->pDb
31960 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
31970 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31980 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
31990 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 20  ePage(pNew);.   
319a0 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20       pNew = 0;. 
319b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
319c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
319d0 4f 4b 20 26 26 20 70 54 72 75 6e 6b 20 29 7b 0a  OK && pTrunk ){.
319e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 72        memcpy(pTr
319f0 75 6e 6b 2d 3e 61 44 61 74 61 2c 20 70 4e 65 77  unk->aData, pNew
31a00 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 75 73  ->aData, pBt->us
31a10 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ableSize);.    }
31a20 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
31a30 4e 65 77 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  New;.    *pPgno 
31a40 3d 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 7d 0a 0a  = pgnoNew;.  }..
31a50 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
31a60 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28  runk);.  assert(
31a70 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc==SQLITE_OK)
31a80 3d 3d 28 2a 70 70 50 61 67 65 21 3d 30 29 20 29  ==(*ppPage!=0) )
31a90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
31aa0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
31ab0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 28  (pBt->pPager)==(
31ac0 6e 52 65 66 2b 28 2a 70 70 50 61 67 65 21 3d 30  nRef+(*ppPage!=0
31ad0 29 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  )) );.  return r
31ae0 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
31af0 20 66 72 65 65 53 65 72 76 65 72 50 61 67 65 32   freeServerPage2
31b00 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
31b10 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
31b20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 69  Pgno iPage){.  i
31b30 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
31b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31b50 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
31b60 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
31b70 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
31b80 20 20 20 2f 2a 20 54 68 65 20 6e 6f 64 65 20 70     /* The node p
31b90 61 67 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  age */.#ifdef SQ
31ba0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 6e 74  LITE_DEBUG.  int
31bb0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
31bc0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
31bd0 2d 3e 70 50 61 67 65 72 29 3b 0a 23 65 6e 64 69  ->pPager);.#endi
31be0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  f..  assert( sql
31bf0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
31c00 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
31c10 20 72 63 20 3d 20 66 69 6e 64 53 65 72 76 65 72   rc = findServer
31c20 54 72 75 6e 6b 28 70 42 74 2c 20 30 2c 20 26 70  Trunk(pBt, 0, &p
31c30 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63  Trunk);.  if( rc
31c40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31c50 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20     int nFree;   
31c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
31c70 6d 62 65 72 20 6f 66 20 66 72 65 65 20 70 61 67  mber of free pag
31c80 65 73 20 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b  es on this trunk
31c90 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 6e 46 72   page */.    nFr
31ca0 65 65 20 3d 20 28 69 6e 74 29 67 65 74 34 62 79  ee = (int)get4by
31cb0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
31cc0 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  a[4]);.    if( n
31cd0 46 72 65 65 3e 3d 28 28 70 42 74 2d 3e 75 73 61  Free>=((pBt->usa
31ce0 62 6c 65 53 69 7a 65 20 2f 20 34 29 20 2d 20 32  bleSize / 4) - 2
31cf0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
31d00 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
31d10 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
31d20 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
31d30 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
31d40 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
31d50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
31d60 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70  agerRef(pPage->p
31d70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  DbPage);.      }
31d80 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
31d90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
31da0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
31db0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31dc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31dd0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e    memcpy(pPage->
31de0 61 44 61 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 61  aData, pTrunk->a
31df0 44 61 74 61 2c 20 70 42 74 2d 3e 75 73 61 62 6c  Data, pBt->usabl
31e00 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
31e10 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
31e20 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 50 61 67  ->aData[0], iPag
31e30 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  e);.        put4
31e40 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
31e50 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20  ata[4], 0);.    
31e60 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
31e70 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
31e80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
31e90 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
31ea0 3e 61 44 61 74 61 5b 38 2b 6e 46 72 65 65 2a 34  >aData[8+nFree*4
31eb0 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
31ec0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
31ed0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 28 75 33  k->aData[4], (u3
31ee0 32 29 6e 46 72 65 65 2b 31 29 3b 0a 20 20 20 20  2)nFree+1);.    
31ef0 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
31f00 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a 0a  e(pTrunk);.  }..
31f10 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d    assert( nRef==
31f20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
31f30 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
31f40 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
31f50 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66  ;.}..#else.# def
31f60 69 6e 65 20 61 6c 6c 6f 63 61 74 65 53 65 72 76  ine allocateServ
31f70 65 72 50 61 67 65 28 76 2c 20 77 2c 20 78 2c 20  erPage(v, w, x, 
31f80 79 2c 20 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  y, z) SQLITE_OK.
31f90 23 20 64 65 66 69 6e 65 20 66 72 65 65 53 65 72  # define freeSer
31fa0 76 65 72 50 61 67 65 32 28 78 2c 20 79 2c 20 7a  verPage2(x, y, z
31fb0 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
31fc0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 53 45 52  if /* SQLITE_SER
31fd0 56 45 52 5f 45 44 49 54 49 4f 4e 20 2a 2f 0a 0a  VER_EDITION */..
31fe0 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
31ff0 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74   new page from t
32000 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32010 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
32020 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
32030 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74  s dirty.  (In ot
32040 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74  her words, sqlit
32050 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a  e3PagerWrite().*
32060 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
32070 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
32080 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65   new page.)  The
32090 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c   new page has al
320a0 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72  so.** been refer
320b0 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61  enced and the ca
320c0 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73  lling routine is
320d0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
320e0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69   calling.** sqli
320f0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
32100 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  on the new page 
32110 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
32120 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
32130 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
32140 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74  success.  Any ot
32150 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  her return value
32160 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e   indicates.** an
32170 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65   error.  *ppPage
32180 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
32190 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
321a0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
321b0 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
321c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
321d0 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f   0, then an effo
321e0 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
321f0 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
32200 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
32210 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
32220 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
32230 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
32240 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
32250 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
32260 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
32270 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
32280 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
32290 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
322a0 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
322b0 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
322c0 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d   the eMode param
322d0 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f  eter is BTALLOC_
322e0 45 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65  EXACT and the ne
322f0 61 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73  arby page exists
32300 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  .** anywhere on 
32310 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
32320 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e  hen it is guaran
32330 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72  teed to be retur
32340 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64  ned.  If.** eMod
32350 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20  e is BTALLOC_LT 
32360 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65  then the page re
32370 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c  turned will be l
32380 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
32390 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69  l.** to nearby i
323a0 66 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20  f any such page 
323b0 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64  exists.  If eMod
323c0 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  e is BTALLOC_ANY
323d0 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61   then there.** a
323e0 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f  re no restrictio
323f0 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65  ns on which page
32400 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
32410 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
32420 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20  cateBtreePage(. 
32430 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
32440 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
32450 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
32460 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
32470 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65   /* Store pointe
32480 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  r to the allocat
32490 65 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  ed page here */.
324a0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20    Pgno *pPgno,  
324b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
324c0 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
324d0 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f  r here */.  Pgno
324e0 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20   nearby,        
324f0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
32500 20 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69   a page near thi
32510 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d  s one */.  u8 eM
32520 6f 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ode             
32530 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41    /* BTALLOC_EXA
32540 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20  CT, BTALLOC_LT, 
32550 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a  or BTALLOC_ANY *
32560 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
32570 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63  pPage1;.  int rc
32580 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f  ;.  u32 n;     /
32590 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
325a0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
325b0 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20  t */.  u32 k;   
325c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
325d0 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75  eaves on the tru
325e0 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  nk of the freeli
325f0 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  st */.  MemPage 
32600 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d  *pTrunk = 0;.  M
32610 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75  emPage *pPrevTru
32620 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d  nk = 0;.  Pgno m
32630 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f  xPage;     /* To
32640 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  tal size of the 
32650 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
32660 0a 0a 20 20 69 66 28 20 62 74 72 65 65 46 72 65  ..  if( btreeFre
32670 65 6c 69 73 74 46 6f 72 6d 61 74 32 28 70 42 74  elistFormat2(pBt
32680 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
32690 61 6c 6c 6f 63 61 74 65 53 65 72 76 65 72 50 61  allocateServerPa
326a0 67 65 28 70 42 74 2c 20 70 70 50 61 67 65 2c 20  ge(pBt, ppPage, 
326b0 70 50 67 6e 6f 2c 20 6e 65 61 72 62 79 2c 20 65  pPgno, nearby, e
326c0 4d 6f 64 65 29 3b 20 0a 20 20 7d 0a 0a 20 20 61  Mode); .  }..  a
326d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
326e0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
326f0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
32700 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  t( eMode==BTALLO
32710 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79  C_ANY || (nearby
32720 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41  >0 && IfNotOmitA
32730 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  V(pBt->autoVacuu
32740 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20  m)) );.  pPage1 
32750 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
32760 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50   mxPage = btreeP
32770 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
32780 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
32790 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54   R-05119-02637 T
327a0 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e  he 4-byte big-en
327b0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20  dian integer at 
327c0 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73  offset 36.  ** s
327d0 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68 65  tores stores the
327e0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
327f0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
32800 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d  eelist. */.  n =
32810 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
32820 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
32830 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78   testcase( n==mx
32840 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20  Page-1 );.  if( 
32850 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  n>=mxPage ){.   
32860 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
32870 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
32880 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
32890 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
328a0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
328b0 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
328c0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
328d0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
328e0 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
328f0 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
32900 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
32910 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
32920 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
32930 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72 63 68  .    u32 nSearch
32940 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74   = 0;   /* Count
32950 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
32960 66 20 73 65 61 72 63 68 20 61 74 74 65 6d 70 74  f search attempt
32970 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a  s */.    .    /*
32980 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   If eMode==BTALL
32990 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71  OC_EXACT and a q
329a0 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
329b0 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
329c0 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
329d0 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
329e0 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
329f0 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
32a00 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
32a10 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
32a20 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
32a30 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
32a40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32a50 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
32a60 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
32a70 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20  LOC_EXACT ){.   
32a80 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d     if( nearby<=m
32a90 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
32aa0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
32ab0 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62     assert( nearb
32ac0 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  y>0 );.        a
32ad0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
32ae0 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20  Vacuum );.      
32af0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
32b00 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
32b10 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
32b20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
32b30 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66  n rc;.        if
32b40 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
32b50 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
32b60 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
32b70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
32b80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
32b90 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41  e if( eMode==BTA
32ba0 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
32bb0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
32bc0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
32bd0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
32be0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
32bf0 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
32c00 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
32c10 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
32c20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
32c30 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
32c40 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
32c50 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
32c60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
32c70 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
32c80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
32c90 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
32ca0 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
32cb0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
32cc0 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
32cd0 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
32ce0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
32cf0 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
32d00 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
32d10 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
32d20 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
32d30 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
32d40 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
32d50 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
32d60 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
32d70 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
32d80 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
32d90 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
32da0 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20  LLOC_EXACT).    
32db0 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61  ** or until a pa
32dc0 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65  ge less than 'ne
32dd0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
32de0 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
32df0 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20  _LT).    */.    
32e00 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
32e10 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
32e20 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
32e30 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
32e40 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
32e50 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68  R-01506-11053 Th
32e60 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
32e70 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
32e80 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20  unk page.       
32e90 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20   ** is the page 
32ea0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
32eb0 78 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  xt freelist trun
32ec0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  k page in the li
32ed0 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  st or.        **
32ee0 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73   zero if this is
32ef0 20 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69   the last freeli
32f00 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a  st trunk page. *
32f10 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  /.        iTrunk
32f20 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
32f30 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
32f40 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
32f50 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
32f60 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31  ENCE-OF: R-59841
32f70 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74  -13798 The 4-byt
32f80 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
32f90 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
32fa0 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  2.        ** sto
32fb0 72 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  res the page num
32fc0 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
32fd0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65   page of the fre
32fe0 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69  elist, or zero i
32ff0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
33000 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70   freelist is emp
33010 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ty. */.        i
33020 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
33030 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
33040 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
33050 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
33060 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
33070 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b        if( iTrunk
33080 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72  >mxPage || nSear
33090 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20  ch++ > n ){.    
330a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
330b0 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 72  CORRUPT_PGNO(pPr
330c0 65 76 54 72 75 6e 6b 20 3f 20 70 50 72 65 76 54  evTrunk ? pPrevT
330d0 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b  runk->pgno : 1);
330e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
330f0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
33100 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
33110 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
33120 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nk, 0);.      }.
33130 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
33140 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
33150 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
33160 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
33170 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
33180 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
33190 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
331a0 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ert( pTrunk->aDa
331b0 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f  ta!=0 );.      /
331c0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
331d0 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54 68 65  -13523-04394 The
331e0 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20   second integer 
331f0 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
33200 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a  unk page.      *
33210 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
33220 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69  of leaf page poi
33230 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e  nters to follow.
33240 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   */.      k = ge
33250 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
33260 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
33270 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
33280 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
33290 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
332a0 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
332b0 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
332c0 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
332d0 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
332e0 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
332f0 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
33300 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
33310 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
33320 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
33330 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
33340 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
33350 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
33360 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
33370 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
33380 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
33390 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
333a0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
333b0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
333c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
333d0 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
333e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
333f0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
33400 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
33410 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
33420 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
33430 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
33440 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
33450 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
33460 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
33470 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
33480 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
33490 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
334a0 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75  ( k>(u32)(pBt->u
334b0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
334c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
334d0 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
334e0 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
334f0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
33500 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
33510 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
33520 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20  GNO(iTrunk);.   
33530 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
33540 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66  locate_page;.#if
33550 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33560 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
33570 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72    }else if( sear
33580 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
33590 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d      && (nearby==
335a0 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e  iTrunk || (iTrun
335b0 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64  k<nearby && eMod
335c0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20  e==BTALLOC_LE)) 
335d0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
335e0 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
335f0 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
33600 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
33610 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
33620 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
33630 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
33640 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
33650 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
33660 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
33670 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
33680 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
33690 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
336a0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
336b0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
336c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
336d0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
336e0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
336f0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
33700 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
33710 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
33720 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
33730 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
33740 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
33750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
33760 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
33770 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
33780 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
33790 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
337a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
337b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
337c0 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
337d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
337e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
337f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33800 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
33810 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
33820 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
33830 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
33840 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
33850 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
33860 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
33870 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
33880 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33890 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
338a0 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
338b0 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
338c0 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
338d0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
338e0 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
338f0 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
33900 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
33910 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
33920 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
33930 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
33940 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
33950 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
33960 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
33970 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
33980 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
33990 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
339a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
339b0 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29  ewTrunk>mxPage )
339c0 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  { .            r
339d0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
339e0 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b  PT_PGNO(iTrunk);
339f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
33a00 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
33a10 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
33a20 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
33a30 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d  ase( iNewTrunk==
33a40 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
33a50 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
33a60 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
33a70 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
33a80 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
33a90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33aa0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33ab0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
33ac0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
33ad0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33ae0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33af0 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
33b00 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
33b10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
33b20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33b30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
33b40 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
33b50 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
33b60 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
33b70 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
33b80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
33b90 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
33ba0 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
33bb0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
33bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
33bd0 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
33be0 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
33bf0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
33c00 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
33c10 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
33c20 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
33c30 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
33c40 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
33c50 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
33c60 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
33c70 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
33c80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33c90 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
33ca0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
33cb0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
33cc0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
33cd0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
33ce0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
33cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33d00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
33d10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
33d20 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
33d30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
33d40 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
33d50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
33d60 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
33d70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
33d80 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
33d90 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
33da0 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
33db0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
33dc0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
33dd0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
33de0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
33df0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
33e00 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
33e10 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
33e20 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
33e30 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
33e40 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
33e50 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
33e60 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
33e70 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
33e80 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
33e90 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
33ea0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
33eb0 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
33ec0 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
33ed0 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
33ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
33ef0 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63  2 i;.          c
33f00 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
33f10 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d        if( eMode=
33f20 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
33f30 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
33f40 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
33f50 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
33f60 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
33f70 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20  Data[8+i*4]);.  
33f80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
33f90 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b  iPage<=nearby ){
33fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33fb0 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
33fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
33fd0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
33fe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
33ff0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
34000 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
34010 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
34020 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c        dist = sql
34030 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
34040 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
34050 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
34060 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
34070 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
34080 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
34090 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
340a0 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
340b0 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
340c0 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
340d0 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
340e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
340f0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
34100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34110 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
34120 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
34130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
34140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
34150 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
34160 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
34170 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
34180 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
34190 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
341a0 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4]);.        tes
341b0 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
341c0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
341d0 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
341e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
341f0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
34200 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a  T_PGNO(iTrunk);.
34210 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
34220 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
34230 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34240 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
34250 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
34260 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
34270 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
34280 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72   || (iPage==near
34290 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61  by || (iPage<nea
342a0 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
342b0 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
342c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
342d0 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a   int noContent;.
342e0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
342f0 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
34300 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
34310 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
34320 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
34330 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
34340 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
34350 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
34360 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
34370 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
34380 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
34390 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
343a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
343b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
343c0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
343d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
343e0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c  rc ) goto end_al
343f0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
34400 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
34410 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
34420 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
34430 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
34440 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
34450 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
34460 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
34470 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
34480 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  -1);.          n
34490 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
344a0 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
344b0 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47  Bt, *pPgno)? PAG
344c0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
344d0 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   : 0;.          
344e0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
344f0 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50  sedPage(pBt, *pP
34500 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
34510 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  ontent);.       
34520 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
34530 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
34540 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34550 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
34560 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
34570 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
34580 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
345a0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
345b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
345c0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
345d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
345e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
345f0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
34600 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
34610 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
34620 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
34630 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
34640 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
34650 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
34660 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
34670 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
34680 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
34690 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65  reelist, so appe
346a0 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  nd a new page to
346b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
346c0 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20  base image..    
346d0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c  **.    ** Normal
346e0 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c  ly, new pages al
346f0 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
34700 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71  block can be req
34710 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  uested from the.
34720 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79      ** pager lay
34730 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d  er with the 'no-
34740 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65  content' flag se
34750 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  t. This prevents
34760 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
34770 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  * from trying to
34780 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20   read the pages 
34790 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
347a0 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  k. However, if t
347b0 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
347c0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  t transaction ha
347d0 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e  s already run on
347e0 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d  e or more increm
347f0 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20  ental-vacuum.   
34800 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20   ** steps, then 
34810 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
34820 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74  about to allocat
34830 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f  e may contain co
34840 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  ntent.    ** tha
34850 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  t is required in
34860 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
34870 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69  rollback. In thi
34880 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a  s case, do.    *
34890 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f  * not set the no
348a0 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54  -content flag. T
348b0 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70  his causes the p
348c0 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64  ager to load and
348d0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
348e0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
348f0 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20   content before 
34900 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a  overwriting it..
34910 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
34920 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
34930 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61  r will not actua
34940 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  lly attempt to l
34950 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a  oad or journal .
34960 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66      ** content f
34970 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  or any page that
34980 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65   really does lie
34990 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
349a0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
349b0 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73    ** file on dis
349c0 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74  k. So the effect
349d0 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74  s of disabling t
349e0 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70  he no-content op
349f0 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a  timization.    *
34a00 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69  * here are confi
34a10 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67  ned to those pag
34a20 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77  es that lie betw
34a30 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74  een the end of t
34a40 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
34a50 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65  se image and the
34a60 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
34a70 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
34a80 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e  /.    int bNoCon
34a90 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74  tent = (0==IfNot
34aa0 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
34ab0 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52  runcate))? PAGER
34ac0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30  _GET_NOCONTENT:0
34ad0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
34ae0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
34af0 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
34b00 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
34b10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
34b20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
34b30 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
34b40 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
34b50 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d  PAGE(pBt) ) pBt-
34b60 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64  >nPage++;..#ifnd
34b70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
34b80 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
34b90 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
34ba0 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
34bb0 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  GE(pBt, pBt->nPa
34bc0 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ge) ){.      /* 
34bd0 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
34be0 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
34bf0 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
34c00 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
34c10 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
34c20 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
34c30 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
34c40 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
34c50 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
34c60 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
34c70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
34c80 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
34c90 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
34ca0 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
34cb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
34cc0 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   0;.      TRACE(
34cd0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
34ce0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
34cf0 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
34d00 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67  e)\n", pBt->nPag
34d10 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e));.      asser
34d20 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50  t( pBt->nPage!=P
34d30 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
34d40 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
34d50 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
34d60 65 64 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d  edPage(pBt, pBt-
34d70 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e  >nPage, &pPg, bN
34d80 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
34d90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34da0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
34db0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
34dc0 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67  rite(pPg->pDbPag
34dd0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
34de0 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20  asePage(pPg);.  
34df0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
34e00 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
34e10 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
34e20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  ++;.      if( pB
34e30 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e  t->nPage==PENDIN
34e40 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
34e50 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b   ){ pBt->nPage++
34e60 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ; }.    }.#endif
34e70 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38  .    put4byte(28
34e80 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61   + (u8*)pBt->pPa
34e90 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  ge1->aData, pBt-
34ea0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50  >nPage);.    *pP
34eb0 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65  gno = pBt->nPage
34ec0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  ;..    assert( *
34ed0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
34ee0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
34ef0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
34f00 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
34f10 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
34f20 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
34f30 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
34f40 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
34f50 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
34f60 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
34f70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
34f80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34f90 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
34fa0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
34fb0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
34fc0 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
34fd0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
34fe0 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
34ff0 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
35000 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
35010 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
35020 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
35030 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
35040 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
35050 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
35060 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
35070 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  k);.  assert( rc
35080 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
35090 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
350a0 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
350b0 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29  )->pDbPage)<=1 )
350c0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
350d0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70  SQLITE_OK || (*p
350e0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
350f0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
35100 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
35110 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
35120 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61   to add page iPa
35130 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
35140 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73  se file free-lis
35150 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  t. .** It is ass
35160 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61  umed that the pa
35170 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
35180 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20  y a part of the 
35190 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
351a0 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   The value passe
351b0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
351c0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
351d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74   function is opt
351e0 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  ional..** If the
351f0 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20   caller happens 
35200 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65  to have a pointe
35210 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  r to the MemPage
35220 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72   object .** corr
35230 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
35240 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69  e iPage handy, i
35250 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73  t may pass it as
35260 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75   the second valu
35270 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  e. .** Otherwise
35280 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55  , it may pass NU
35290 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70  LL..**.** If a p
352a0 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50  ointer to a MemP
352b0 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61  age object is pa
352c0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
352d0 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
352e0 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
352f0 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72  unt is not alter
35300 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
35310 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
35320 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53  nt freePage2(BtS
35330 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50  hared *pBt, MemP
35340 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50  age *pMemPage, P
35350 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65  gno iPage){.  Me
35360 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
35370 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
35380 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74    /* Free-list t
35390 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50  runk page */.  P
353a0 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20  gno iTrunk = 0; 
353b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
353c0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
353d0 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74  r of free-list t
353e0 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20  runk page */ .  
353f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
35400 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20  = pBt->pPage1;  
35410 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66      /* Local ref
35420 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
35430 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
35440 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
35450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
35460 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d  e being freed. M
35470 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  ay be NULL. */. 
35480 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
35490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
354a0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
354b0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ode */.  int nFr
354c0 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
354d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
354e0 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
354f0 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d  f pages on free-
35500 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
35510 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
35520 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
35530 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
35540 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61  ORRUPT_DB || iPa
35550 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
35560 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
35570 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
35580 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69  Page );..  if( i
35590 50 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20  Page<2 ) return 
355a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
355b0 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50  KPT;.  if( pMemP
355c0 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
355d0 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
355e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
355f0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
35600 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
35610 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
35620 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
35630 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  e);.  }..  if( p
35640 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
35650 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
35660 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
35670 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20  e secure_delete 
35680 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
35690 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  d, then.    ** a
356a0 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72  lways fully over
356b0 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
356c0 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
356d0 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eros..    */.   
356e0 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20   if( (!pPage && 
356f0 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  ((rc = btreeGetP
35700 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
35710 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20  &pPage, 0))!=0) 
35720 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20  ).     ||       
35730 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69       ((rc = sqli
35740 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
35750 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d  age->pDbPage))!=
35760 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
35770 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
35780 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  t;.    }.    mem
35790 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
357a0 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  , 0, pPage->pBt-
357b0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
357c0 20 20 0a 20 20 69 66 28 20 62 74 72 65 65 46 72    .  if( btreeFr
357d0 65 65 6c 69 73 74 46 6f 72 6d 61 74 32 28 70 42  eelistFormat2(pB
357e0 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  t) ){.    rc = f
357f0 72 65 65 53 65 72 76 65 72 50 61 67 65 32 28 70  reeServerPage2(p
35800 42 74 2c 20 70 50 61 67 65 2c 20 69 50 61 67 65  Bt, pPage, iPage
35810 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  );.    goto free
35820 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
35830 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
35840 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
35850 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
35860 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35870 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
35880 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
35890 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
358a0 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20  ge_out;.  nFree 
358b0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
358c0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
358d0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
358e0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
358f0 46 72 65 65 2b 31 29 3b 0a 0a 20 20 2f 2a 20 49  Free+1);..  /* I
35900 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
35910 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
35920 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
35930 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
35940 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
35950 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
35960 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
35970 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
35980 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74  VACUUM ){.    pt
35990 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
359a0 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
359b0 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
359c0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
359d0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
359e0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
359f0 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
35a00 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
35a10 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
35a20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
35a30 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
35a40 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
35a50 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
35a60 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
35a70 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
35a80 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
35a90 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
35aa0 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
35ab0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
35ac0 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
35ad0 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
35ae0 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
35af0 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
35b00 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
35b10 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
35b20 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
35b30 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
35b40 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
35b50 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
35b60 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
35b70 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
35b80 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
35b90 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
35ba0 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
35bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
35bc0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
35bd0 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
35be0 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
35bf0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
35c00 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
35c10 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
35c20 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
35c30 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
35c40 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
35c50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35c60 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
35c70 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
35c80 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
35c90 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
35ca0 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
35cb0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
35cc0 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
35cd0 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
35ce0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
35cf0 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
35d00 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
35d10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
35d20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
35d30 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
35d40 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
35d50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
35d60 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
35d70 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
35d80 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
35d90 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
35da0 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
35db0 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
35dc0 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
35dd0 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
35de0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
35df0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
35e00 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
35e10 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
35e20 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
35e30 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
35e40 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
35e50 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
35e60 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
35e70 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
35e80 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
35e90 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
35ea0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
35eb0 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
35ec0 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
35ed0 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
35ee0 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
35ef0 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
35f00 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
35f10 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
35f20 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
35f30 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
35f40 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
35f50 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
35f60 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
35f70 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
35f80 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
35f90 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
35fa0 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
35fb0 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
35fc0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
35fd0 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
35fe0 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
35ff0 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
36000 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
36010 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
36020 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
36030 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
36040 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
36050 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
36060 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
36070 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
36080 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
36090 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
360a0 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
360b0 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
360c0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
360d0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30  ENCE-OF: R-19920
360e0 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20  -11576 However, 
360f0 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
36100 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20  f SQLite still. 
36110 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73       ** avoid us
36120 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78  ing the last six
36130 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
36140 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
36150 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20  age array in.   
36160 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74     ** order that
36170 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
36180 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72  created by newer
36190 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
361a0 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20  ite can be.     
361b0 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65   ** read by olde
361c0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
361d0 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Lite..      */. 
361e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
361f0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
36200 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
36210 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36220 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
36230 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
36240 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
36250 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
36260 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
36270 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
36280 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
36290 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
362a0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
362b0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
362c0 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
362d0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
362e0 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
362f0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
36300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
36310 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
36320 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
36330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36340 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
36350 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
36360 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
36370 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
36380 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
36390 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
363a0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
363b0 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
363c0 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
363d0 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
363e0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
363f0 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
36400 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
36410 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
36420 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
36430 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
36440 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
36450 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
36460 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
36470 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
36480 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
36490 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
364a0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
364b0 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
364c0 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
364d0 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
364e0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
364f0 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
36500 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
36510 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
36520 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
36530 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
36540 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
36550 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
36560 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
36570 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
36580 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
36590 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
365a0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
365b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
365c0 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
365d0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
365e0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
365f0 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
36600 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
36610 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
36620 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
36630 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
36640 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
36650 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
36660 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
36670 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
36680 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
36690 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
366a0 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
366b0 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
366c0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
366d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
366e0 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
366f0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
36700 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
36710 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
36720 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
36730 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
36740 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
36750 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
36760 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
36770 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
36780 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
36790 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
367a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
367b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
367c0 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20  the given Cell. 
367d0 20 53 74 6f 72 65 0a 2a 2a 20 73 69 7a 65 20 69   Store.** size i
367e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
367f0 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 70 49 6e   the cell in pIn
36800 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  fo..*/.static in
36810 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d  t clearCell(.  M
36820 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
36830 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
36840 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
36850 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20  s the Cell */.  
36860 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
36870 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73  Cell,    /* Firs
36880 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65  t byte of the Ce
36890 6c 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  ll */.  CellInfo
368a0 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
368b0 20 2f 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61   /* Size informa
368c0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
368d0 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ell */.){.  BtSh
368e0 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e  ared *pBt;.  Pgn
368f0 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
36900 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
36910 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67  l;.  u32 ovflPag
36920 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
36930 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
36940 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
36950 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
36960 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
36970 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e  Page, pCell, pIn
36980 66 6f 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f  fo);.  if( pInfo
36990 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d  ->nLocal==pInfo-
369a0 3e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  >nPayload ){.   
369b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
369c0 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
369d0 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
369e0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
369f0 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
36a00 20 69 66 28 20 70 43 65 6c 6c 2b 70 49 6e 66 6f   if( pCell+pInfo
36a10 2d 3e 6e 53 69 7a 65 2d 31 20 3e 20 70 50 61 67  ->nSize-1 > pPag
36a20 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
36a30 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20  maskPage ){.    
36a40 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20  /* Cell extends 
36a50 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65  past end of page
36a60 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
36a70 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
36a80 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
36a90 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
36aa0 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e  byte(pCell + pIn
36ab0 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a  fo->nSize - 4);.
36ac0 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
36ad0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  Bt;.  assert( pB
36ae0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20  t->usableSize > 
36af0 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  4 );.  ovflPageS
36b00 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
36b10 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
36b20 66 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61  fl = (pInfo->nPa
36b30 79 6c 6f 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e  yload - pInfo->n
36b40 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
36b50 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
36b60 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
36b70 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20  ( nOvfl>0 || .  
36b80 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26    (CORRUPT_DB &&
36b90 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
36ba0 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  d + ovflPageSize
36bb0 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a  )<ovflPageSize).
36bc0 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f    );.  while( nO
36bd0 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e  vfl-- ){.    Pgn
36be0 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  o iNext = 0;.   
36bf0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
36c00 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  = 0;.    if( ovf
36c10 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50  lPgno<2 || ovflP
36c20 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
36c30 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
36c40 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c   /* 0 is not a l
36c50 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
36c60 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e   and page 1 cann
36c70 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20  ot be an .      
36c80 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
36c90 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f  . Therefore if o
36ca0 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73  vflPgno<2 or pas
36cb0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
36cc0 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
36cd0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
36ce0 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f  t be corrupt. */
36cf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
36d00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
36d10 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
36d20 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   nOvfl ){.      
36d30 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
36d40 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
36d50 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65  no, &pOvfl, &iNe
36d60 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xt);.      if( r
36d70 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
36d80 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20     }..    if( ( 
36d90 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c  pOvfl || ((pOvfl
36da0 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
36db0 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  up(pBt, ovflPgno
36dc0 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26  ))!=0) ).     &&
36dd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
36de0 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d  eRefcount(pOvfl-
36df0 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20  >pDbPage)!=1.   
36e00 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
36e10 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20  re is no reason 
36e20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c  any cursor shoul
36e30 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61  d have an outsta
36e40 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20  nding reference 
36e50 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20  .      ** to an 
36e60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65  overflow page be
36e70 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c  longing to a cel
36e80 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  l that is being 
36e90 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e  deleted/updated.
36ea0 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20  .      ** So if 
36eb0 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72  there exists mor
36ec0 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72  e than one refer
36ed0 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 67  ence to this pag
36ee0 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20  e, then it .    
36ef0 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65    ** must not re
36f00 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66  ally be an overf
36f10 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68 65  low page and the
36f20 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
36f30 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20  e corrupt. .    
36f40 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66    ** It is helpf
36f50 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68 69  ul to detect thi
36f60 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  s before calling
36f70 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61 73   freePage2(), as
36f80 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50   .      ** freeP
36f90 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20  age2() may zero 
36fa0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
36fb0 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65  s if secure-dele
36fc0 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20  te mode is.     
36fd0 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   ** enabled. If 
36fe0 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20  this 'overflow' 
36ff0 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20  page happens to 
37000 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20 74  be a page that t
37010 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  he.      ** call
37020 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67 20  er is iterating 
37030 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67  through or using
37040 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77   in some other w
37050 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a  ay, this.      *
37060 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d  * can be problem
37070 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atic..      */. 
37080 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
37090 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
370a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
370b0 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  rc = freePage2(p
370c0 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50  Bt, pOvfl, ovflP
370d0 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  gno);.    }..   
370e0 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20   if( pOvfl ){.  
370f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
37100 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62  Unref(pOvfl->pDb
37110 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
37120 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
37130 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e   rc;.    ovflPgn
37140 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20  o = iNext;.  }. 
37150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37160 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
37170 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75  te the byte sequ
37180 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70  ence used to rep
37190 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e  resent a cell on
371a0 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61   page pPage.** a
371b0 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79  nd write that by
371c0 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f  te sequence into
371d0 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66   pCell[].  Overf
371e0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  low pages are.**
371f0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66   allocated and f
37200 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65  illed in as nece
37210 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c  ssary.  The call
37220 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a  ing procedure.**
37230 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
37240 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
37250 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
37260 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
37270 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c  ted.** for pCell
37280 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  []..**.** Note t
37290 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e  hat pCell does n
372a0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65  ot necessary nee
372b0 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
372c0 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  e pPage->aData.*
372d0 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d  * area.  pCell m
372e0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f  ight point to so
372f0 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  me temporary sto
37300 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20  rage.  The cell 
37310 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74  will.** be const
37320 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74  ructed in this t
37330 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68  emporary area th
37340 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70  en copied into p
37350 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c  Page->aData.** l
37360 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ater..*/.static 
37370 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a  int fillInCell(.
37380 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
37390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
373a0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
373b0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  t contains the c
373c0 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
373d0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
373e0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
373f0 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
37400 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cell */.  const 
37410 42 74 72 65 65 50 61 79 6c 6f 61 64 20 2a 70 58  BtreePayload *pX
37420 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 79 6c  ,        /* Payl
37430 6f 61 64 20 77 69 74 68 20 77 68 69 63 68 20 74  oad with which t
37440 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
37450 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  cell */.  int *p
37460 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
37470 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
37480 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
37490 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
374a0 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
374b0 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
374c0 53 72 63 2c 20 6e 2c 20 72 63 2c 20 6d 6e 3b 0a  Src, n, rc, mn;.
374d0 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
374e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
374f0 65 6c 65 61 73 65 3b 0a 20 20 75 6e 73 69 67 6e  elease;.  unsign
37500 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b  ed char *pPrior;
37510 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
37520 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74   *pPayload;.  Bt
37530 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 50  Shared *pBt;.  P
37540 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 3b 0a 20 20  gno pgnoOvfl;.  
37550 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20  int nHeader;..  
37560 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
37570 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
37580 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
37590 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
375a0 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
375b0 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20  writeable since 
375c0 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61  pCell might be a
375d0 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75  uxiliary.  ** bu
375e0 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20  ffer space that 
375f0 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d  is separate from
37600 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65   the pPage buffe
37610 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65  r area */.  asse
37620 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d  rt( pCell<pPage-
37630 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e  >aData || pCell>
37640 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
37650 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
37660 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
37670 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
37680 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
37690 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
376a0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
376b0 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
376c0 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63  eader = pPage->c
376d0 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 69  hildPtrSize;.  i
376e0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
376f0 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64   ){.    nPayload
37700 20 3d 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70   = pX->nData + p
37710 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53  X->nZero;.    pS
37720 72 63 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a  rc = pX->pData;.
37730 20 20 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e      nSrc = pX->n
37740 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
37750 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
37760 65 61 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e  eaf ); /* fillIn
37770 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c  Cell() only call
37780 65 64 20 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f  ed for leaves */
37790 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
377a0 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  putVarint32(&pCe
377b0 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61  ll[nHeader], nPa
377c0 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65 61  yload);.    nHea
377d0 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
377e0 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
377f0 2c 20 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b  , *(u64*)&pX->nK
37800 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ey);.  }else{.  
37810 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b    assert( pX->nK
37820 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66 20 26  ey<=0x7fffffff &
37830 26 20 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b  & pX->pKey!=0 );
37840 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 50 61 79  .    nSrc = nPay
37850 6c 6f 61 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e  load = (int)pX->
37860 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
37870 20 70 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e   pX->pKey;.    n
37880 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
37890 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65  int32(&pCell[nHe
378a0 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ader], nPayload)
378b0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69  ;.  }.  .  /* Fi
378c0 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
378d0 64 20 2a 2f 0a 20 20 70 50 61 79 6c 6f 61 64 20  d */.  pPayload 
378e0 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
378f0 5d 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  ];.  if( nPayloa
37900 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
37910 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
37920 73 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  s is the common 
37930 63 61 73 65 20 77 68 65 72 65 20 65 76 65 72 79  case where every
37940 74 68 69 6e 67 20 66 69 74 73 20 6f 6e 20 74 68  thing fits on th
37950 65 20 62 74 72 65 65 20 70 61 67 65 0a 20 20 20  e btree page.   
37960 20 2a 2a 20 61 6e 64 20 6e 6f 20 6f 76 65 72 66   ** and no overf
37970 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 72 65  low pages are re
37980 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 6e  quired. */.    n
37990 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61   = nHeader + nPa
379a0 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63  yload;.    testc
379b0 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20  ase( n==3 );.   
379c0 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20   testcase( n==4 
379d0 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29  );.    if( n<4 )
379e0 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53   n = 4;.    *pnS
379f0 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 61 73 73  ize = n;.    ass
37a00 65 72 74 28 20 6e 53 72 63 3c 3d 6e 50 61 79 6c  ert( nSrc<=nPayl
37a10 6f 61 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63  oad );.    testc
37a20 61 73 65 28 20 6e 53 72 63 3c 6e 50 61 79 6c 6f  ase( nSrc<nPaylo
37a30 61 64 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ad );.    memcpy
37a40 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
37a50 20 6e 53 72 63 29 3b 0a 20 20 20 20 6d 65 6d 73   nSrc);.    mems
37a60 65 74 28 70 50 61 79 6c 6f 61 64 2b 6e 53 72 63  et(pPayload+nSrc
37a70 2c 20 30 2c 20 6e 50 61 79 6c 6f 61 64 2d 6e 53  , 0, nPayload-nS
37a80 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rc);.    return 
37a90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
37aa0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
37ab0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
37ac0 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
37ad0 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  of the content w
37ae0 69 6c 6c 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f  ill need.  ** to
37af0 20 73 70 69 6c 6c 20 6f 6e 74 6f 20 6f 76 65 72   spill onto over
37b00 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f  flow pages..  */
37b10 0a 20 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d  .  mn = pPage->m
37b20 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6e 20 3d 20 6d  inLocal;.  n = m
37b30 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  n + (nPayload - 
37b40 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  mn) % (pPage->pB
37b50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
37b60 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  4);.  testcase( 
37b70 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  n==pPage->maxLoc
37b80 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
37b90 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
37ba0 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
37bb0 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  n > pPage->maxLo
37bc0 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20  cal ) n = mn;.  
37bd0 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20  spaceLeft = n;. 
37be0 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e   *pnSize = n + n
37bf0 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 70 50  Header + 4;.  pP
37c00 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  rior = &pCell[nH
37c10 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 70 54 6f 52  eader+n];.  pToR
37c20 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 70 67  elease = 0;.  pg
37c30 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 70 42  noOvfl = 0;.  pB
37c40 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
37c50 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
37c60 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68  int variables sh
37c70 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66  ould be set as f
37c80 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
37c90 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20  *   nPayload    
37ca0 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79         Total pay
37cb0 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74  load size in byt
37cc0 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f  es.  **   pPaylo
37cd0 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67  ad           Beg
37ce0 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f  in writing paylo
37cf0 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73  ad here.  **   s
37d00 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20  paceLeft        
37d10 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c    Space availabl
37d20 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20  e at pPayload.  
37d30 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63  If nPayload>spac
37d40 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20  eLeft,.  **     
37d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d60 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74   that means cont
37d70 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69  ent must spill i
37d80 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
37d90 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69  es..  **   *pnSi
37da0 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69  ze            Si
37db0 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20  ze of the local 
37dc0 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69  cell (not counti
37dd0 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ng overflow page
37de0 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72  s).  **   pPrior
37df0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65               Whe
37e00 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  re to write the 
37e10 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73  pgno of the firs
37e20 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  t overflow page.
37e30 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20    **.  ** Use a 
37e40 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72  call to btreePar
37e50 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76  seCellPtr() to v
37e60 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76  erify that the v
37e70 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a  alues above.  **
37e80 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63   were computed c
37e90 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23  orrectly..  */.#
37ea0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
37eb0 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49  UG.  {.    CellI
37ec0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50  nfo info;.    pP
37ed0 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
37ee0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
37ef0 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
37f00 28 20 6e 48 65 61 64 65 72 3d 3d 28 69 6e 74 29  ( nHeader==(int)
37f10 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d  (info.pPayload -
37f20 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61   pCell) );.    a
37f30 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79  ssert( info.nKey
37f40 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  ==pX->nKey );.  
37f50 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a    assert( *pnSiz
37f60 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20  e == info.nSize 
37f70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
37f80 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f  paceLeft == info
37f90 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a 23  .nLocal );.  }.#
37fa0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74  endif..  /* Writ
37fb0 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e  e the payload in
37fc0 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c  to the local Cel
37fd0 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20  l and any extra 
37fe0 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  into overflow pa
37ff0 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ges */.  while( 
38000 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 50 61  1 ){.    n = nPa
38010 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
38020 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
38030 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20   spaceLeft;..   
38040 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
38050 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
38060 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e  an pPayload poin
38070 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
38080 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20   area.    ** of 
38090 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
380a0 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
380b0 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
380c0 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  able. */.    ass
380d0 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
380e0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
380f0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
38100 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
38110 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  e) );..    /* If
38120 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72   pPayload is par
38130 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
38140 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
38150 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
38160 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c  e.    ** is stil
38170 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
38180 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c     assert( pPayl
38190 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  oad<pPage->aData
381a0 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70   || pPayload>=&p
381b0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
381c0 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
381d0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
381e0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
381f0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
38200 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53  ) );..    if( nS
38210 72 63 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 6d  rc>=n ){.      m
38220 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
38230 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
38240 6c 73 65 20 69 66 28 20 6e 53 72 63 3e 30 20 29  lse if( nSrc>0 )
38250 7b 0a 20 20 20 20 20 20 6e 20 3d 20 6e 53 72 63  {.      n = nSrc
38260 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
38270 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
38280 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
38290 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
382a0 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
382b0 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
382c0 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 50 61  = n;.    if( nPa
382d0 79 6c 6f 61 64 3c 3d 30 20 29 20 62 72 65 61 6b  yload<=0 ) break
382e0 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b  ;.    pPayload +
382f0 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d  = n;.    pSrc +=
38300 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20   n;.    nSrc -= 
38310 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
38320 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 73   -= n;.    if( s
38330 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  paceLeft==0 ){. 
38340 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f       MemPage *pO
38350 76 66 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  vfl = 0;.#ifndef
38360 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
38370 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
38380 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
38390 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
383a0 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
383b0 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
383c0 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
383d0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
383e0 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
383f0 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
38400 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
38410 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
38420 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
38430 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
38440 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
38450 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
38460 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
38470 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
38480 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
38490 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &