/ Hex Artifact Content
Login

Artifact d3bdd8462a86492e2ebc9aca4a0168429017de25:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a70: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a80: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a90: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3aa0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3ab0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ac0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ad0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ae0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3af0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3b00: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b10: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b20: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b60: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b80: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b90: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3ba0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3bb0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bc0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3be0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3bf0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3c00: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c10: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c20: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c30: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c40: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c50: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c60: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c70: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c80: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c90: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3ca0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3cb0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cc0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3ce0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3cf0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3d00: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d10: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d40: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d70: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d80: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3da0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3db0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3dc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dd0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3de0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3df0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3e00: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e10: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e20: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e30: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e40: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e50: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e60: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e70: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e80: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e90: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3ea0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3eb0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3ec0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ed0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ee0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ef0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3f00: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f10: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f20: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f30: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f40: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f50: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f60: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f70: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f80: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f90: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3fa0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fb0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fc0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fd0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fe0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4000: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4010: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4020: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4040: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4050: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4060: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4070: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4080: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4090: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
40a0: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40c0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40d0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
40f0: 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e  f( pBtree->hasIn
4100: 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72  crblobCur==0 ) r
4110: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
4120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
4130: 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
4140: 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68 61 73  );.  pBtree->has
4150: 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b  IncrblobCur = 0;
4160: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
4170: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
4180: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
4190: 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c     if( (p->curFl
41a0: 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62  ags & BTCF_Incrb
41b0: 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  lob)!=0 ){.     
41c0: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
41d0: 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20 20 20  blobCur = 1;.   
41e0: 20 20 20 69 66 28 20 69 73 43 6c 65 61 72 54 61     if( isClearTa
41f0: 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e  ble || p->info.n
4200: 4b 65 79 3d 3d 69 52 6f 77 20 29 7b 0a 20 20 20  Key==iRow ){.   
4210: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
4220: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
4230: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4240: 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a   }.}..#else.  /*
4250: 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77   Stub function w
4260: 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20  hen INCRBLOB is 
4270: 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65  omitted */.  #de
4280: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
4290: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78  ncrblobCursors(x
42a0: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
42b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
42c0: 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  BLOB */../*.** S
42d0: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
42e0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
42f0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
4300: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
4310: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
4320: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
4330: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
4340: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
4350: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
4360: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
4370: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4380: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
4390: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
43a0: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
43b0: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
43c0: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
43d0: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
43e0: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
43f0: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
4400: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
4410: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
4420: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
4430: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
4440: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
4450: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
4460: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
4470: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
4480: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4490: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
44a0: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
44b0: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
44c0: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
44d0: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
44e0: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
44f0: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
4500: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
4510: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
4520: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
4530: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
4540: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
4550: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
4560: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4570: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
4580: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
4590: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
45a0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
45b0: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
45c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
45d0: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
45e0: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
45f0: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
4600: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
4610: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
4620: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
4630: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
4640: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
4650: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
4660: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
4670: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
4680: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
4690: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
46a0: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
46b0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
46c0: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
46d0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
46e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
46f0: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
4700: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
4710: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
4720: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
4730: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4740: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
4750: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
4760: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
4770: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4780: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4790: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
47a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
47b0: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
47c0: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
47d0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
47e0: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
47f0: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
4800: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
4810: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
4820: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
4830: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
4840: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
4850: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4860: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
4870: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
4880: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
4890: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
48a0: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
48b0: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
48c0: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
48d0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
48e0: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
48f0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4900: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
4910: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
4920: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
4930: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4940: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
4950: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
4960: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
4970: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4980: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
4990: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
49a0: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
49b0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
49c0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
49d0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
49e0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
49f0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
4a00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
4a10: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
4a20: 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
4a30: 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50  t( pgno<=pBt->nP
4a40: 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age );.    pBt->
4a50: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
4a60: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
4a70: 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  e(pBt->nPage);. 
4a80: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4a90: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4aa0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4ab0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4ac0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4ad0: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
4ae0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
4af0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
4b00: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4b10: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4b20: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4b30: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4b40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4b50: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
4b60: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
4b70: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4b80: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4b90: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4ba0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4bb0: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
4bc0: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
4bd0: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
4be0: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
4bf0: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
4c00: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
4c10: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4c20: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4c30: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4c40: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4c50: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
4c60: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
4c70: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4c80: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4c90: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4ca0: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4cb0: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
4cc0: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
4cd0: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
4ce0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
4cf0: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
4d00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
4d10: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4d20: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4d30: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4d40: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4d50: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
4d60: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
4d70: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4d80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4d90: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4da0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4db0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4dc0: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4dd0: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4de0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4df0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
4e00: 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68  elease all of th
4e10: 65 20 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73  e apPage[] pages
4e20: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a   for a cursor..*
4e30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
4e40: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
4e50: 73 6f 72 50 61 67 65 73 28 42 74 43 75 72 73 6f  sorPages(BtCurso
4e60: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
4e70: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
4e80: 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
4e90: 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
4ea0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4eb0: 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  [i]);.    pCur->
4ec0: 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
4ed0: 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65   }.  pCur->iPage
4ee0: 20 3d 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   = -1;.}../*.** 
4ef0: 54 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65  The cursor passe
4f00: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
4f10: 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e  gument must poin
4f20: 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  t to a valid ent
4f30: 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ry.** when this 
4f40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
4f50: 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53  ed (i.e. have eS
4f60: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
4f70: 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ID). This.** fun
4f80: 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20  ction saves the 
4f90: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b  current cursor k
4fa0: 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20  ey in variables 
4fb0: 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a  pCur->nKey and.*
4fc0: 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51  * pCur->pKey. SQ
4fd0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
4fe0: 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ned if successfu
4ff0: 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  l or an SQLite e
5000: 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74  rror .** code ot
5010: 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  herwise..**.** I
5020: 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
5030: 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65  open on an intke
5040: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  y table, then th
5050: 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a  e integer key.**
5060: 20 28 74 68 65 20 72 6f 77 69 64 29 20 69 73 20   (the rowid) is 
5070: 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e  stored in pCur->
5080: 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70  nKey and pCur->p
5090: 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65 74 20  Key is left set 
50a0: 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74  to.** NULL. If t
50b0: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  he cursor is ope
50c0: 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  n on a non-intke
50d0: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43  y table, then pC
50e0: 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20  ur->pKey is .** 
50f0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
5100: 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65  a malloced buffe
5110: 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74  r pCur->nKey byt
5120: 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61  es in size conta
5130: 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65  ining .** the ke
5140: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
5150: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42   saveCursorKey(B
5160: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5170: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
5180: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
5190: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
51a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
51b0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
51c0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
51d0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
51e0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
51f0: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
5200: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
5210: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
5220: 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20  QLITE_OK );  /* 
5230: 4b 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74  KeySize() cannot
5240: 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49   fail */..  /* I
5250: 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74  f this is an int
5260: 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  Key table, then 
5270: 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74  the above call t
5280: 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29  o BtreeKeySize()
5290: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
52a0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20   integer key in 
52b0: 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74  pCur->nKey. In t
52c0: 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61  his case this va
52d0: 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20  lue is.  ** all 
52e0: 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
52f0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
5300: 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e  pCur is not open
5310: 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20   on an intKey.  
5320: 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ** table, then m
5330: 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20  alloc space for 
5340: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43  and store the pC
5350: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f  ur->nKey bytes o
5360: 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61  f key .  ** data
5370: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
5380: 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
5390: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
53a0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
53b0: 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a  ( pCur->nKey );.
53c0: 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
53d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
53e0: 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
53f0: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5400: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5410: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5420: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5430: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5440: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5450: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
5460: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
5470: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5480: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5490: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
54a0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
54b0: 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21  ->curIntKey || !
54c0: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20  pCur->pKey );.  
54d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
54e0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72  .** Save the cur
54f0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5500: 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69  tion in the vari
5510: 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e  ables BtCursor.n
5520: 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75  Key .** and BtCu
5530: 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63  rsor.pKey. The c
5540: 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73  ursor's state is
5550: 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52   set to CURSOR_R
5560: 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a  EQUIRESEEK..**.*
5570: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
5580: 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  t ensure that th
5590: 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
55a0: 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43  d (has eState==C
55b0: 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20  URSOR_VALID).** 
55c0: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
55d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
55e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
55f0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
5600: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
5610: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
5620: 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
5630: 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
5640: 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49  te || CURSOR_SKI
5650: 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74  PNEXT==pCur->eSt
5660: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
5670: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
5680: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5690: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
56a0: 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75  r) );..  if( pCu
56b0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
56c0: 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20  R_SKIPNEXT ){.  
56d0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
56e0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
56f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
5700: 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
5710: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76 65    }..  rc = save
5720: 43 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29 3b  CursorKey(pCur);
5730: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5740: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65  E_OK ){.    btre
5750: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5760: 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20  rPages(pCur);.  
5770: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
5780: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
5790: 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72  EEK;.  }..  pCur
57a0: 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
57b0: 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
57c0: 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
57d0: 43 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72 65  CF_AtLast);.  re
57e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
57f0: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
5800: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53   */.static int S
5810: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
5820: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5830: 28 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c  (BtCursor*,Pgno,
5840: 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a  BtCursor*);../*.
5850: 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  ** Save the posi
5860: 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72  tions of all cur
5870: 73 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78  sors (except pEx
5880: 63 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f  cept) that are o
5890: 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61  pen on.** the ta
58a0: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
58b0: 67 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69  ge iRoot.  "Savi
58c0: 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ng the cursor po
58d0: 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68  sition" means th
58e0: 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69  at.** the locati
58f0: 6f 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20  on in the btree 
5900: 69 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e  is remembered in
5910: 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74   such a way that
5920: 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f   it can be.** mo
5930: 76 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ved back to the 
5940: 73 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20  same spot after 
5950: 74 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65  the btree has be
5960: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68  en modified.  Th
5970: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
5980: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66   called just bef
5990: 6f 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65  ore cursor pExce
59a0: 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f  pt is used to mo
59b0: 64 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c  dify the.** tabl
59c0: 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69  e, for example i
59d0: 6e 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20  n BtreeDelete() 
59e0: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
59f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
5a00: 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65   are two or more
5a10: 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
5a20: 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e  same btree, then
5a30: 20 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75   all such .** cu
5a40: 72 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76  rsors should hav
5a50: 65 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c  e their BTCF_Mul
5a60: 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20  tiple flag set. 
5a70: 20 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72   The btreeCursor
5a80: 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e  ().** routine en
5a90: 66 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65  forces that rule
5aa0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
5ab0: 6f 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65  only needs to be
5ac0: 20 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68   called in.** th
5ad0: 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  e uncommon case 
5ae0: 77 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73  when pExpect has
5af0: 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70   the BTCF_Multip
5b00: 6c 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  le flag set..**.
5b10: 2a 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e  ** If pExpect!=N
5b20: 55 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74  ULL and if no ot
5b30: 68 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20  her cursors are 
5b40: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d  found on the sam
5b50: 65 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20  e root-page,.** 
5b60: 74 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75  then the BTCF_Mu
5b70: 6c 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70  ltiple flag on p
5b80: 45 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65  Expect is cleare
5b90: 64 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74  d, to avoid anot
5ba0: 68 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73  her.** pointless
5bb0: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
5bc0: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70  utine..**.** Imp
5bd0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65  lementation note
5be0: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
5bf0: 6d 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f  merely checks to
5c00: 20 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73   see if any curs
5c10: 6f 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62  ors.** need to b
5c20: 65 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c  e saved.  It cal
5c30: 6c 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75  ls out to saveCu
5c40: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e  rsorsOnList() in
5c50: 20 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a   the (unusual).*
5c60: 2a 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72  * event that cur
5c70: 73 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64  sors are in need
5c80: 20 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e   to being saved.
5c90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5ca0: 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  aveAllCursors(Bt
5cb0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
5cc0: 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f  o iRoot, BtCurso
5cd0: 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42  r *pExcept){.  B
5ce0: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
5cf0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
5d00: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
5d10: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
5d20: 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20  ( pExcept==0 || 
5d30: 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42  pExcept->pBt==pB
5d40: 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  t );.  for(p=pBt
5d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
5d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
5d70: 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26  f( p!=pExcept &&
5d80: 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d   (0==iRoot || p-
5d90: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
5da0: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ) ) break;.  }. 
5db0: 20 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20   if( p ) return 
5dc0: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
5dd0: 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63  t(p, iRoot, pExc
5de0: 65 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63  ept);.  if( pExc
5df0: 65 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63  ept ) pExcept->c
5e00: 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
5e10: 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74  _Multiple;.  ret
5e20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
5e30: 0a 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72  ../* This helper
5e40: 20 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65   routine to save
5e50: 41 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20  AllCursors does 
5e60: 74 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20  the actual work 
5e70: 6f 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65  of saving.** the
5e80: 20 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20   cursors if and 
5e90: 77 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73  when a cursor is
5ea0: 20 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75   found that actu
5eb0: 61 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61  ally requires sa
5ec0: 76 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d  ving..** The com
5ed0: 6d 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74  mon case is that
5ee0: 20 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64   no cursors need
5ef0: 20 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f   to be saved, so
5f00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5f10: 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66  .** broken out f
5f20: 72 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74  rom its caller t
5f30: 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73  o avoid unnecess
5f40: 61 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65  ary stack pointe
5f50: 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73  r movement..*/.s
5f60: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
5f70: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
5f80: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42  rsorsOnList(.  B
5f90: 74 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20  tCursor *p,     
5fa0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
5fb0: 20 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65   cursor that nee
5fc0: 64 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50  ds saving */.  P
5fd0: 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20  gno iRoot,      
5fe0: 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65      /* Only save
5ff0: 20 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69   cursor with thi
6000: 73 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c  s iRoot. Save al
6010: 6c 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42  l if zero */.  B
6020: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
6030: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61      /* Do not sa
6040: 76 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a  ve this cursor *
6050: 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  /.){.  do{.    i
6060: 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26  f( p!=pExcept &&
6070: 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d   (0==iRoot || p-
6080: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
6090: 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
60a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
60b0: 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74  _VALID || p->eSt
60c0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
60d0: 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  NEXT ){.        
60e0: 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72  int rc = saveCur
60f0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a  sorPosition(p);.
6100: 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
6110: 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
6120: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
6130: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6140: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6150: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50   testcase( p->iP
6160: 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  age>0 );.       
6170: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
6180: 43 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a  CursorPages(p);.
6190: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
61a0: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
61b0: 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20    }while( p );. 
61c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
61d0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  K;.}../*.** Clea
61e0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  r the current cu
61f0: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
6200: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
6210: 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42  reeClearCursor(B
6220: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
6230: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
6240: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
6250: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
6260: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
6270: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
6280: 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
6290: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
62a0: 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74  D;.}../*.** In t
62b0: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42  his version of B
62c0: 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79  treeMoveto, pKey
62d0: 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64   is a packed ind
62e0: 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63  ex record.** suc
62f0: 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65  h as is generate
6300: 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
6310: 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20  Record opcode.  
6320: 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65  Unpack the.** re
6330: 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61  cord and then ca
6340: 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  ll BtreeMovetoUn
6350: 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74  packed() to do t
6360: 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74  he work..*/.stat
6370: 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65  ic int btreeMove
6380: 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  to(.  BtCursor *
6390: 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72  pCur,     /* Cur
63a0: 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  sor open on the 
63b0: 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72  btree to be sear
63c0: 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ched */.  const 
63d0: 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
63e0: 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74   Packed key if t
63f0: 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69  he btree is an i
6400: 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b  ndex */.  i64 nK
6410: 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
6420: 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   Integer key for
6430: 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f   tables.  Size o
6440: 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63  f pKey for indic
6450: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  es */.  int bias
6460: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
6470: 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68  ias search to th
6480: 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
6490: 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
64a0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
64b0: 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
64c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64e0: 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f      /* Status co
64f0: 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  de */.  Unpacked
6500: 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b  Record *pIdxKey;
6510: 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69     /* Unpacked i
6520: 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68  ndex key */.  ch
6530: 61 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20  ar aSpace[200]; 
6540: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
6550: 20 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b   space for pIdxK
6560: 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ey - to avoid a 
6570: 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72  malloc */.  char
6580: 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20   *pFree = 0;..  
6590: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
65a0: 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69  assert( nKey==(i
65b0: 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a  64)(int)nKey );.
65c0: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71      pIdxKey = sq
65d0: 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
65e0: 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20  packedRecord(.  
65f0: 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79        pCur->pKey
6600: 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69  Info, aSpace, si
6610: 7a 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70  zeof(aSpace), &p
6620: 46 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Free.    );.    
6630: 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
6640: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
6650: 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65  OMEM;.    sqlite
6660: 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
6670: 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  k(pCur->pKeyInfo
6680: 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65  , (int)nKey, pKe
6690: 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
66a0: 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46   if( pIdxKey->nF
66b0: 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ield==0 ){.     
66c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
66d0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
66e0: 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20  b, pFree);.     
66f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
6700: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6710: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
6720: 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  pIdxKey = 0;.  }
6730: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
6740: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6750: 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79  ed(pCur, pIdxKey
6760: 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52  , nKey, bias, pR
6770: 65 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65  es);.  if( pFree
6780: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
6790: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
67a0: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
67b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
67c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74  c;.}../*.** Rest
67d0: 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ore the cursor t
67e0: 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69  o the position i
67f0: 74 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20  t was in (or as 
6800: 63 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73  close to as poss
6810: 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61  ible).** when sa
6820: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
6830: 28 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e  () was called. N
6840: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
6850: 6c 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a  ll deletes the .
6860: 2a 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f  ** saved positio
6870: 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79  n info stored by
6880: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6890: 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20  ion(), so there 
68a0: 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73  can be.** at mos
68b0: 74 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20  t one effective 
68c0: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
68d0: 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74  ition() call aft
68e0: 65 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65  er each .** save
68f0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6900: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6910: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
6920: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
6930: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
6940: 74 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70  t rc;.  int skip
6950: 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Next;.  assert( 
6960: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
6970: 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
6980: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
6990: 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
69a0: 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
69b0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
69c0: 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
69d0: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
69e0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75  pNext;.  }.  pCu
69f0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
6a00: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63  OR_INVALID;.  rc
6a10: 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70   = btreeMoveto(p
6a20: 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c  Cur, pCur->pKey,
6a30: 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20   pCur->nKey, 0, 
6a40: 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66  &skipNext);.  if
6a50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6a60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
6a70: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b  ree(pCur->pKey);
6a80: 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  .    pCur->pKey 
6a90: 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
6aa0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
6ab0: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
6ac0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6ad0: 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20  SOR_INVALID );. 
6ae0: 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
6af0: 74 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20  t |= skipNext;. 
6b00: 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
6b10: 70 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65  pNext && pCur->e
6b20: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6b30: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75  LID ){.      pCu
6b40: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
6b50: 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20  OR_SKIPNEXT;.   
6b60: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
6b70: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
6b80: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6b90: 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e  tion(p) \.  (p->
6ba0: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
6bb0: 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20  EQUIRESEEK ? \. 
6bc0: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73          btreeRes
6bd0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6be0: 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20  on(p) : \.      
6bf0: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f     SQLITE_OK)../
6c00: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77  *.** Determine w
6c10: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
6c20: 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64  cursor has moved
6c30: 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69   from the positi
6c40: 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77  on where.** it w
6c50: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20  as last placed, 
6c60: 6f 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61  or has been inva
6c70: 6c 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20  lidated for any 
6c80: 6f 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a  other reason..**
6c90: 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76   Cursors can mov
6ca0: 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74  e when the row t
6cb0: 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67  hey are pointing
6cc0: 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f   at is deleted o
6cd0: 75 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72  ut.** from under
6ce0: 20 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70   them, for examp
6cf0: 6c 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68  le.  Cursor migh
6d00: 74 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61  t also move if a
6d10: 20 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62   btree.** is reb
6d20: 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43  alanced..**.** C
6d30: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
6d40: 69 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ine with a NULL 
6d50: 63 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72  cursor pointer r
6d60: 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a  eturns false..**
6d70: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70 61  .** Use the sepa
6d80: 72 61 74 65 20 73 71 6c 69 74 65 33 42 74 72 65  rate sqlite3Btre
6d90: 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29  eCursorRestore()
6da0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74   routine to rest
6db0: 6f 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  ore a cursor.** 
6dc0: 62 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74  back to where it
6dd0: 20 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66 20   ought to be if 
6de0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
6df0: 75 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e  urns true..*/.in
6e00: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
6e10: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
6e20: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
6e30: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74  return pCur->eSt
6e40: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
6e50: 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  D;.}../*.** This
6e60: 20 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65   routine restore
6e70: 73 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20  s a cursor back 
6e80: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
6e90: 70 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69  position after i
6ea0: 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f  t.** has been mo
6eb0: 76 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73  ved by some outs
6ec0: 69 64 65 20 61 63 74 69 76 69 74 79 20 28 73 75  ide activity (su
6ed0: 63 68 20 61 73 20 61 20 62 74 72 65 65 20 72 65  ch as a btree re
6ee0: 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20  balance or.** a 
6ef0: 72 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20  row having been 
6f00: 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
6f10: 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
6f20: 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  r).  .**.** On s
6f30: 75 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69  uccess, the *pDi
6f40: 66 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d  fferentRow param
6f50: 65 74 65 72 20 69 73 20 66 61 6c 73 65 20 69 66  eter is false if
6f60: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   the cursor is l
6f70: 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  eft.** pointing 
6f80: 61 74 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  at exactly the s
6f90: 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66  ame row.  *pDiff
6fa0: 65 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72  erntRow is the r
6fb0: 6f 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  ow the cursor.**
6fc0: 20 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f   was pointing to
6fd0: 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65   has been delete
6fe0: 64 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63  d, forcing the c
6ff0: 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
7000: 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79  o some.** nearby
7010: 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   row..**.** This
7020: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
7030: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66  only be called f
7040: 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
7050: 20 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a   just returned.*
7060: 2a 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69  * TRUE from sqli
7070: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
7080: 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74  sMoved()..*/.int
7090: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
70a0: 73 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75 72  sorRestore(BtCur
70b0: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
70c0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a  pDifferentRow){.
70d0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
70e0: 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a  ert( pCur!=0 );.
70f0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
7100: 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
7110: 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72  ALID );.  rc = r
7120: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
7130: 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
7140: 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69  ( rc ){.    *pDi
7150: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
7160: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
7170: 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65   }.  if( pCur->e
7180: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
7190: 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66  LID ){.    *pDif
71a0: 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20  ferentRow = 1;. 
71b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
71c0: 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
71d0: 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44  xt==0 );.    *pD
71e0: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b  ifferentRow = 0;
71f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
7200: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64  LITE_OK;.}..#ifd
7210: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
7220: 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a  _CURSOR_HINTS./*
7230: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74  .** Provide hint
7240: 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e  s to the cursor.
7250: 20 20 54 68 65 20 70 61 72 74 69 63 75 6c 61 72    The particular
7260: 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64   hint given (and
7270: 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64   the type.** and
7280: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76   number of the v
7290: 61 72 61 72 67 73 20 70 61 72 61 6d 65 74 65 72  arargs parameter
72a0: 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  s) is determined
72b0: 20 62 79 20 74 68 65 20 65 48 69 6e 74 54 79 70   by the eHintTyp
72c0: 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20  e.** parameter. 
72d0: 20 53 65 65 20 74 68 65 20 64 65 66 69 6e 69 74   See the definit
72e0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45  ions of the BTRE
72f0: 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20  E_HINT_* macros 
7300: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
7310: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
7320: 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75  eCursorHint(BtCu
7330: 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
7340: 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b  eHintType, ...){
7350: 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20  .  /* Used only 
7360: 62 79 20 73 79 73 74 65 6d 20 74 68 61 74 20 73  by system that s
7370: 75 62 73 74 69 74 75 74 65 20 74 68 65 69 72 20  ubstitute their 
7380: 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69  own storage engi
7390: 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ne */.}.#endif..
73a0: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c  /*.** Provide fl
73b0: 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20  ag hints to the 
73c0: 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20  cursor..*/.void 
73d0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
73e0: 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75  orHintFlags(BtCu
73f0: 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69  rsor *pCur, unsi
7400: 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72  gned x){.  asser
7410: 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b  t( x==BTREE_SEEK
7420: 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f  _EQ || x==BTREE_
7430: 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30  BULKLOAD || x==0
7440: 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74   );.  pCur->hint
7450: 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  s = x;.}...#ifnd
7460: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
7470: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
7480: 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d  Given a page num
7490: 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72  ber of a regular
74a0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
74b0: 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a  return the page.
74c0: 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
74d0: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  e pointer-map pa
74e0: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
74f0: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
7500: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65  he.** input page
7510: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52   number..**.** R
7520: 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76  eturn 0 (not a v
7530: 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20 70  alid page) for p
7540: 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65  gno==1 since the
7550: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e  re is.** no poin
7560: 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74  ter map associat
7570: 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e 20  ed with page 1. 
7580: 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63   The integrity_c
7590: 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65  heck logic.** re
75a0: 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72 6d  quires that ptrm
75b0: 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31  apPageno(*,1)!=1
75c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
75d0: 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74   ptrmapPageno(Bt
75e0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
75f0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e  o pgno){.  int n
7600: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
7610: 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c  .  Pgno iPtrMap,
7620: 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20   ret;.  assert( 
7630: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7640: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
7650: 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29  ;.  if( pgno<2 )
7660: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61   return 0;.  nPa
7670: 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20  gesPerMapPage = 
7680: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
7690: 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70  /5)+1;.  iPtrMap
76a0: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
76b0: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
76c0: 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e  ret = (iPtrMap*n
76d0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29  PagesPerMapPage)
76e0: 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74   + 2; .  if( ret
76f0: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
7700: 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
7710: 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ret++;.  }.  ret
7720: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
7730: 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79  * Write an entry
7740: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
7750: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
7760: 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65  s routine update
7770: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
7780: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
7790: 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a   number 'key'.**
77a0: 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73   so that it maps
77b0: 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27   to type 'eType'
77c0: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
77d0: 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a   number 'pgno'..
77e0: 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73  **.** If *pRC is
77f0: 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a   initially non-z
7800: 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f  ero (non-SQLITE_
7810: 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f  OK) then this ro
7820: 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f  utine is.** a no
7830: 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  -op.  If an erro
7840: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70  r occurs, the ap
7850: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
7860: 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a  code is written.
7870: 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f  ** into *pRC..*/
7880: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
7890: 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20  mapPut(BtShared 
78a0: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
78b0: 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70  u8 eType, Pgno p
78c0: 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29  arent, int *pRC)
78d0: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
78e0: 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69  age;  /* The poi
78f0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7900: 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20  .  u8 *pPtrmap; 
7910: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
7920: 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a  ter map data */.
7930: 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20    Pgno iPtrmap; 
7940: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
7950: 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  er map page numb
7960: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  er */.  int offs
7970: 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  et;       /* Off
7980: 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  set in pointer m
7990: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ap page */.  int
79a0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f   rc;           /
79b0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
79c0: 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20  om subfunctions 
79d0: 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
79e0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
79f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
7a00: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
7a10: 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d  x) );.  /* The m
7a20: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61  aster-journal pa
7a30: 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e  ge number must n
7a40: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20  ever be used as 
7a50: 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  a pointer map pa
7a60: 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
7a70: 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45  0==PTRMAP_ISPAGE
7a80: 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59  (pBt, PENDING_BY
7a90: 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b  TE_PAGE(pBt)) );
7aa0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
7ab0: 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
7ac0: 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20   if( key==0 ){. 
7ad0: 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
7ae0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
7af0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
7b00: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
7b10: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
7b20: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
7b30: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
7b40: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
7b50: 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20   &pDbPage, 0);. 
7b60: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7b70: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
7b80: 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
7b90: 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
7ba0: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
7bb0: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
7bc0: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
7bd0: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
7be0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
7bf0: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61  ;.    goto ptrma
7c00: 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73  p_exit;.  }.  as
7c10: 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20  sert( offset <= 
7c20: 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
7c30: 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72  Size-5 );.  pPtr
7c40: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
7c50: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
7c60: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
7c70: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
7c80: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
7c90: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
7ca0: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
7cb0: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
7cc0: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
7cd0: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
7ce0: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
7cf0: 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63  ));.    *pRC= rc
7d00: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
7d10: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
7d20: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
7d30: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
7d40: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
7d50: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
7d60: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
7d70: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
7d80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74  );.    }.  }..pt
7d90: 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c  rmap_exit:.  sql
7da0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
7db0: 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
7dc0: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
7dd0: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
7de0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
7df0: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
7e00: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
7e10: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
7e20: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
7e30: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
7e40: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
7e50: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
7e60: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
7e70: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
7e80: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
7e90: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
7ea0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
7eb0: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
7ec0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
7ed0: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
7ee0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
7ef0: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
7f00: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
7f10: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
7f20: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
7f30: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
7f40: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
7f50: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
7f60: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
7f70: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
7f80: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
7f90: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
7fa0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
7fb0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
7fc0: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
7fd0: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
7fe0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
7ff0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
8000: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
8010: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
8020: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
8030: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
8040: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
8050: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
8060: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30  map, &pDbPage, 0
8070: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
8080: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
8090: 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d  .  }.  pPtrmap =
80a0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
80b0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
80c0: 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d  ge);..  offset =
80d0: 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45   PTRMAP_PTROFFSE
80e0: 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b  T(iPtrmap, key);
80f0: 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20  .  if( offset<0 
8100: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ){.    sqlite3Pa
8110: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
8120: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
8130: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8140: 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
8150: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
8160: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
8170: 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  5 );.  assert( p
8180: 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70  EType!=0 );.  *p
8190: 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b  EType = pPtrmap[
81a0: 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70  offset];.  if( p
81b0: 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20  Pgno ) *pPgno = 
81c0: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
81d0: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20  p[offset+1]);.. 
81e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
81f0: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69  ef(pDbPage);.  i
8200: 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20  f( *pEType<1 || 
8210: 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75  *pEType>5 ) retu
8220: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8230: 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e  T_BKPT;.  return
8240: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
8250: 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e  else /* if defin
8260: 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed SQLITE_OMIT_A
8270: 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23  UTOVACUUM */.  #
8280: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
8290: 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23  (w,x,y,z,rc).  #
82a0: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74  define ptrmapGet
82b0: 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45  (w,x,y,z) SQLITE
82c0: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74  _OK.  #define pt
82d0: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78  rmapPutOvflPtr(x
82e0: 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a  , y, rc).#endif.
82f0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62  ./*.** Given a b
8300: 74 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20  tree page and a 
8310: 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65  cell index (0 me
8320: 61 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65  ans the first ce
8330: 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67  ll on.** the pag
8340: 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73  e, 1 means the s
8350: 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20  econd cell, and 
8360: 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e  so forth) return
8370: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
8380: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
8390: 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c  t..**.** findCel
83a0: 6c 50 61 73 74 50 74 72 28 29 20 64 6f 65 73 20  lPastPtr() does 
83b0: 74 68 65 20 73 61 6d 65 20 65 78 63 65 70 74 20  the same except 
83c0: 69 74 20 73 6b 69 70 73 20 70 61 73 74 20 74 68  it skips past th
83d0: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62  e initial.** 4-b
83e0: 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  yte child pointe
83f0: 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72  r found on inter
8400: 69 6f 72 20 70 61 67 65 73 2c 20 69 66 20 74 68  ior pages, if th
8410: 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a  ere is one..**.*
8420: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
8430: 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61  orks only for pa
8440: 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20  ges that do not 
8450: 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77  contain overflow
8460: 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69   cells..*/.#defi
8470: 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29  ne findCell(P,I)
8480: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
8490: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
84a0: 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67  e & get2byteAlig
84b0: 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49  ned(&(P)->aCellI
84c0: 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65  dx[2*(I)]))).#de
84d0: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73  fine findCellPas
84e0: 74 50 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28  tPtr(P,I) \.  ((
84f0: 50 29 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20  P)->aDataOfst + 
8500: 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26  ((P)->maskPage &
8510: 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64   get2byteAligned
8520: 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b  (&(P)->aCellIdx[
8530: 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a  2*(I)]))).../*.*
8540: 2a 20 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e  * This is common
8550: 20 74 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67   tail processing
8560: 20 66 6f 72 20 62 74 72 65 65 50 61 72 73 65 43   for btreeParseC
8570: 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20  ellPtr() and.** 
8580: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8590: 72 49 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65  rIndex() for the
85a0: 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 63   case when the c
85b0: 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74  ell does not fit
85c0: 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20   entirely.** on 
85d0: 61 20 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20  a single B-tree 
85e0: 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65  page.  Make nece
85f0: 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74  ssary adjustment
8600: 73 20 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66  s to the CellInf
8610: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  o.** structure..
8620: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
8630: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62  _NOINLINE void b
8640: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a  treeParseCellAdj
8650: 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c  ustSizeForOverfl
8660: 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ow(.  MemPage *p
8670: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
8680: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
8690: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
86a0: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
86b0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
86c0: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
86d0: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
86e0: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
86f0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
8700: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
8710: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79  .  /* If the pay
8720: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
8730: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
8740: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
8750: 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20  we have.  ** to 
8760: 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20  decide how much 
8770: 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
8780: 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f   and how much to
8790: 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a   spill onto.  **
87a0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
87b0: 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69    The strategy i
87c0: 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68  s to minimize th
87d0: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73  e amount of unus
87e0: 65 64 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e  ed.  ** space on
87f0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
8800: 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68  while keeping th
8810: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61  e amount of loca
8820: 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69  l storage.  ** i
8830: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
8840: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
8850: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69  .  **.  ** Warni
8860: 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68  ng:  changing th
8870: 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70  e way overflow p
8880: 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69  ayload is distri
8890: 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a  buted in any.  *
88a0: 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c  * way will resul
88b0: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  t in an incompat
88c0: 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  ible file format
88d0: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e  ..  */.  int min
88e0: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d  Local;  /* Minim
88f0: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
8900: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
8910: 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f  y */.  int maxLo
8920: 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  cal;  /* Maximum
8930: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
8940: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
8950: 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73  */.  int surplus
8960: 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  ;   /* Overflow 
8970: 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c  payload availabl
8980: 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72  e for local stor
8990: 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63  age */..  minLoc
89a0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
89b0: 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c  ocal;.  maxLocal
89c0: 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   = pPage->maxLoc
89d0: 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20  al;.  surplus = 
89e0: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66  minLocal + (pInf
89f0: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69  o->nPayload - mi
8a00: 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e  nLocal)%(pPage->
8a10: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
8a20: 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  4);.  testcase( 
8a30: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
8a40: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
8a50: 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63   surplus==maxLoc
8a60: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75  al+1 );.  if( su
8a70: 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61  rplus <= maxLoca
8a80: 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  l ){.    pInfo->
8a90: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75  nLocal = (u16)su
8aa0: 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rplus;.  }else{.
8ab0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8ac0: 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61  l = (u16)minLoca
8ad0: 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e  l;.  }.  pInfo->
8ae0: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36  iOverflow = (u16
8af0: 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  )(&pInfo->pPaylo
8b00: 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c  ad[pInfo->nLocal
8b10: 5d 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 70 49  ] - pCell);.  pI
8b20: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e  nfo->nSize = pIn
8b30: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20  fo->iOverflow + 
8b40: 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  4;.}../*.** The 
8b50: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
8b60: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
8b70: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
8b80: 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c  mPage.xParseCell
8b90: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ().** method..**
8ba0: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
8bb0: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
8bc0: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
8bd0: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
8be0: 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61  e..**.** btreePa
8bf0: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20  rseCellPtr()    
8c00: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62      =>   table b
8c10: 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  tree leaf nodes.
8c20: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
8c30: 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e  lNoPayload()  =>
8c40: 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69     table btree i
8c50: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
8c60: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
8c70: 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20  trIndex()   =>  
8c80: 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64   index btree nod
8c90: 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  es.**.** There i
8ca0: 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72  s also a wrapper
8cb0: 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50   function btreeP
8cc0: 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20  arseCell() that 
8cd0: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c  works for.** all
8ce0: 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61   MemPage types a
8cf0: 6e 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  nd that referenc
8d00: 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69  es the cell by i
8d10: 6e 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e  ndex rather than
8d20: 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a  .** by pointer..
8d30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
8d40: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8d50: 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d  NoPayload(.  Mem
8d60: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
8d70: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
8d80: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
8d90: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
8da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8db0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
8dc0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
8dd0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
8de0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
8df0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
8e00: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
8e10: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
8e20: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
8e30: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
8e40: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
8e50: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
8e60: 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61   pPage->noPayloa
8e70: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  d );.  assert( p
8e80: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
8e90: 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66  ze==4 );.#ifndef
8ea0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
8eb0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
8ec0: 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a  (pPage);.#endif.
8ed0: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8ee0: 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26   4 + getVarint(&
8ef0: 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29  pCell[4], (u64*)
8f00: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
8f10: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
8f20: 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e   = 0;.  pInfo->n
8f30: 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e  Local = 0;.  pIn
8f40: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
8f50: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  0;.  pInfo->pPay
8f60: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  load = 0;.  retu
8f70: 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rn;.}.static voi
8f80: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
8f90: 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Ptr(.  MemPage *
8fa0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
8fb0: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
8fc0: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
8fd0: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
8fe0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
8ff0: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
9000: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
9010: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
9020: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
9030: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
9040: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20  {.  u8 *pIter;  
9050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9060: 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  or scanning thro
9070: 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75  ugh pCell */.  u
9080: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
9090: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
90a0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
90b0: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  l payload */.  u
90c0: 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20  64 iKey;        
90d0: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
90e0: 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f  ted Key value */
90f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
9100: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9110: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
9120: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9130: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
9140: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
9150: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9160: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 7c  ge->intKeyLeaf |
9170: 7c 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  | pPage->noPaylo
9180: 61 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ad );.  assert( 
9190: 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64  pPage->noPayload
91a0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
91b0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
91c0: 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  af );.  assert( 
91d0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
91e0: 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  ize==0 );.  pIte
91f0: 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a  r = pCell;..  /*
9200: 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20   The next block 
9210: 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76  of code is equiv
9220: 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20  alent to:.  **. 
9230: 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d   **     pIter +=
9240: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
9250: 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  er, nPayload);. 
9260: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64   **.  ** The cod
9270: 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20  e is inlined to 
9280: 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e  avoid a function
9290: 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50   call..  */.  nP
92a0: 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b  ayload = *pIter;
92b0: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e  .  if( nPayload>
92c0: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20  =0x80 ){.    u8 
92d0: 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38  *pEnd = &pIter[8
92e0: 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  ];.    nPayload 
92f0: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b  &= 0x7f;.    do{
9300: 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  .      nPayload 
9310: 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20  = (nPayload<<7) 
9320: 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78  | (*++pIter & 0x
9330: 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  7f);.    }while(
9340: 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38 30 20   (*pIter)>=0x80 
9350: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
9360: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a  .  }.  pIter++;.
9370: 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62  .  /* The next b
9380: 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20  lock of code is 
9390: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20  equivalent to:. 
93a0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74   **.  **     pIt
93b0: 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28  er += getVarint(
93c0: 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49  pIter, (u64*)&pI
93d0: 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a  nfo->nKey);.  **
93e0: 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69  .  ** The code i
93f0: 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f  s inlined to avo
9400: 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61  id a function ca
9410: 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20  ll..  */.  iKey 
9420: 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20  = *pIter;.  if( 
9430: 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20  iKey>=0x80 ){.  
9440: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
9450: 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79  ter[7];.    iKey
9460: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 77 68   &= 0x7f;.    wh
9470: 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20 69 4b  ile(1){.      iK
9480: 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c  ey = (iKey<<7) |
9490: 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37   (*++pIter & 0x7
94a0: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a  f);.      if( (*
94b0: 70 49 74 65 72 29 3c 30 78 38 30 20 29 20 62 72  pIter)<0x80 ) br
94c0: 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eak;.      if( p
94d0: 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20  Iter>=pEnd ){.  
94e0: 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b        iKey = (iK
94f0: 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65  ey<<8) | *++pIte
9500: 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  r;.        break
9510: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9520: 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a    }.  pIter++;..
9530: 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20    pInfo->nKey = 
9540: 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20  *(i64*)&iKey;.  
9550: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
9560: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
9570: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
9580: 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73  pIter;.  testcas
9590: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
95a0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
95b0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
95c0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
95d0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
95e0: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
95f0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
9600: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
9610: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
9620: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
9630: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
9640: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
9650: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
9660: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
9670: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
9680: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
9690: 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29  nPayload + (u16)
96a0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
96b0: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
96c0: 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d  nSize<4 ) pInfo-
96d0: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
96e0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
96f0: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
9700: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
9710: 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  low = 0;.  }else
9720: 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
9730: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9740: 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c  rOverflow(pPage,
9750: 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
9760: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
9770: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
9780: 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50  PtrIndex(.  MemP
9790: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
97a0: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
97b0: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
97c0: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
97e0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
97f0: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
9800: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
9810: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
9820: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
9830: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74   */.){.  u8 *pIt
9840: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
9850: 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67   /* For scanning
9860: 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a   through pCell *
9870: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
9880: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
9890: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
98a0: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
98b0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
98c0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
98d0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
98e0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
98f0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
9900: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
9910: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9920: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d  age->intKeyLeaf=
9930: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9940: 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64  pPage->noPayload
9950: 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d  ==0 );.  pIter =
9960: 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e   pCell + pPage->
9970: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
9980: 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65  nPayload = *pIte
9990: 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  r;.  if( nPayloa
99a0: 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  d>=0x80 ){.    u
99b0: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
99c0: 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  [8];.    nPayloa
99d0: 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  d &= 0x7f;.    d
99e0: 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  o{.      nPayloa
99f0: 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37  d = (nPayload<<7
9a00: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
9a10: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
9a20: 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38  e( *(pIter)>=0x8
9a30: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
9a40: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
9a50: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20  ;.  pInfo->nKey 
9a60: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
9a70: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
9a80: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
9a90: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49  o->pPayload = pI
9aa0: 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ter;.  testcase(
9ab0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9ac0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
9ad0: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
9ae0: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
9af0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
9b00: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
9b10: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
9b20: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
9b30: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
9b40: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
9b50: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
9b60: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
9b70: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
9b80: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
9b90: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
9ba0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50  Info->nSize = nP
9bb0: 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70  ayload + (u16)(p
9bc0: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
9bd0: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53     if( pInfo->nS
9be0: 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  ize<4 ) pInfo->n
9bf0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
9c00: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
9c10: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20  16)nPayload;.   
9c20: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
9c30: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
9c40: 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
9c50: 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f  llAdjustSizeForO
9c60: 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70  verflow(pPage, p
9c70: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  Cell, pInfo);.  
9c80: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
9c90: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  btreeParseCell(.
9ca0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
9cb0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
9cc0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
9cd0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
9ce0: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
9cf0: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
9d00: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
9d10: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
9d20: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9d30: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9d40: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9d50: 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  .){.  pPage->xPa
9d60: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 66  rseCell(pPage, f
9d70: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
9d80: 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d  Cell), pInfo);.}
9d90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
9da0: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
9db0: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  re implementatio
9dc0: 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ns of the MemPag
9dd0: 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d  e.xCellSize.** m
9de0: 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ethod..**.** Com
9df0: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
9e00: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
9e10: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
9e20: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
9e30: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
9e40: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
9e50: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
9e60: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
9e70: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
9e80: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
9e90: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
9ea0: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
9eb0: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
9ec0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
9ed0: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  ll pointer..**.*
9ee0: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  * cellSizePtrNoP
9ef0: 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20 20  ayload()    =>  
9f00: 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20   table internal 
9f10: 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a  nodes.** cellSiz
9f20: 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20 20  ePtr()          
9f30: 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65     =>   all inde
9f40: 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65 20  x nodes & table 
9f50: 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74  leaf nodes.*/.st
9f60: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
9f70: 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  ePtr(MemPage *pP
9f80: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
9f90: 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70  .  u8 *pIter = p
9fa0: 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68  Cell + pPage->ch
9fb0: 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46  ildPtrSize; /* F
9fc0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
9fd0: 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a  bytes of pCell *
9fe0: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20  /.  u8 *pEnd;   
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a010: 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76  End mark for a v
a020: 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e  arint */.  u32 n
a030: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75      /* Size valu
a060: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  e to return */..
a070: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a080: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
a090: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
a0a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
a0b0: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
a0c0: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
a0d0: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
a0e0: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
a0f0: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
a100: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
a110: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
a120: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
a130: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
a140: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
a150: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
a160: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
a170: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
a180: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
a190: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
a1a0: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61  debuginfo;.  pPa
a1b0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a1c0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
a1d0: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66  buginfo);.#endif
a1e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
a1f0: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d 30 20  e->noPayload==0 
a200: 29 3b 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49  );.  nSize = *pI
a210: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
a220: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
a230: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a240: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
a250: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
a260: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
a270: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
a280: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
a290: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
a2a0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
a2b0: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
a2c0: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
a2d0: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
a2e0: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
a2f0: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
a300: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
a310: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
a320: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
a330: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
a340: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
a350: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
a360: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
a370: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
a380: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
a390: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
a3a0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
a3b0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
a3c0: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
a3d0: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
a3e0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
a3f0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
a400: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
a410: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
a420: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
a430: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
a440: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
a450: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
a460: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a470: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
a480: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
a490: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
a4a0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
a4b0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
a4c0: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
a4d0: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
a4e0: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
a4f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
a500: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
a510: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
a520: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
a530: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
a540: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
a550: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
a560: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
a570: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
a580: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
a590: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
a5a0: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
a5b0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
a5c0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
a5d0: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
a5e0: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
a5f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
a600: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69  6)nSize;.}.stati
a610: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
a620: 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61  rNoPayload(MemPa
a630: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
a640: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
a650: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20  er = pCell + 4; 
a660: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
a670: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
a680: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
a690: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
a6a0: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
a6b0: 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64   varint */..#ifd
a6c0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a6d0: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
a6e0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
a6f0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
a700: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
a710: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
a720: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
a730: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
a740: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
a750: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
a760: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
a770: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
a780: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
a790: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
a7a0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
a7b0: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
a7c0: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
a7d0: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
a7e0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
a7f0: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
a800: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
a810: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
a820: 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nfo);.#else.  UN
a830: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
a840: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Page);.#endif.. 
a850: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a860: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
a870: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
a880: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
a890: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
a8a0: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
a8b0: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
a8c0: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
a8d0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a8e0: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
a8f0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
a900: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
a910: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
a920: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
a930: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
a940: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
a950: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
a960: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
a970: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
a980: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
a990: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
a9a0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
a9b0: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
a9c0: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
a9d0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
a9e0: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
a9f0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
aa00: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
aa10: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
aa20: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
aa30: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
aa40: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
aa50: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
aa60: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
aa70: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
aa80: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
aa90: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
aaa0: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
aab0: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f   void ptrmapPutO
aac0: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
aad0: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
aae0: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43  , int *pRC){.  C
aaf0: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
ab00: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
ab10: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  n;.  assert( pCe
ab20: 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  ll!=0 );.  pPage
ab30: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
ab40: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
ab50: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
ab60: 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50  verflow ){.    P
ab70: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
ab80: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
ab90: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
aba0: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
abb0: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
abc0: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
abd0: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
abe0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
abf0: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
ac00: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
ac10: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
ac20: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
ac30: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
ac40: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
ac50: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
ac60: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
ac70: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
ac80: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
ac90: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
aca0: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
acb0: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
acc0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
acd0: 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  **.** EVIDENCE-O
ace0: 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38  F: R-44582-60138
acf0: 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d   SQLite may from
ad00: 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65   time to time re
ad10: 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d  organize a.** b-
ad20: 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68 61  tree page so tha
ad30: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66  t there are no f
ad40: 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61  reeblocks or fra
ad50: 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c  gment bytes, all
ad60: 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73  .** unused bytes
ad70: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
ad80: 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65  n the unallocate
ad90: 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20  d space region, 
ada0: 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73  and all.** cells
adb0: 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67 68   are packed tigh
adc0: 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  tly at the end o
add0: 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  f the page..*/.s
ade0: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
adf0: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
ae00: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
ae10: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
ae20: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
ae30: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
ae40: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
ae50: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
ae60: 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65  s of the i-th ce
ae70: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae90: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
aea0: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
aeb0: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
aee0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
aef0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
af00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
af10: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
af20: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
af30: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
af40: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
af50: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
af60: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
af70: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
af80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
af90: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
afa0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
afb0: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
afd0: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
afe0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
aff0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b000: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
b010: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
b020: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b030: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
b040: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
b050: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
b060: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73  unsigned char *s
b070: 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f  rc;        /* So
b080: 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20  urce of content 
b090: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  */.  int iCellFi
b0a0: 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
b0b0: 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62  /* First allowab
b0c0: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
b0d0: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74  .  int iCellLast
b0e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
b0f0: 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63   Last possible c
b100: 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20  ell index */... 
b110: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b120: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
b130: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
b140: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b150: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
b160: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b170: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
b180: 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  <= SQLITE_MAX_PA
b190: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73  GE_SIZE );.  ass
b1a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
b1b0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
b1c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b1d0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
b1e0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
b1f0: 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63   temp = 0;.  src
b200: 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d   = data = pPage-
b210: 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
b220: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b230: 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
b240: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
b250: 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  et;.  nCell = pP
b260: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
b270: 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74  sert( nCell==get
b280: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
b290: 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  3]) );.  usableS
b2a0: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
b2b0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
b2c0: 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a  cbrk = usableSiz
b2d0: 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  e;.  iCellFirst 
b2e0: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
b2f0: 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c  *nCell;.  iCellL
b300: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
b310: 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   - 4;.  for(i=0;
b320: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
b330: 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20      u8 *pAddr;  
b340: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
b350: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
b360: 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61     pAddr = &data
b370: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a  [cellOffset + i*
b380: 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74  2];.    pc = get
b390: 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20  2byte(pAddr);.  
b3a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
b3b0: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
b3c0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
b3d0: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
b3e0: 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74   /* These condit
b3f0: 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64  ions have alread
b400: 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20  y been verified 
b410: 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  in btreeInitPage
b420: 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50 52 41  ().    ** if PRA
b430: 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68  GMA cell_size_ch
b440: 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20  eck=ON..    */. 
b450: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
b460: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
b470: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
b480: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b490: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b4a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d      assert( pc>=
b4b0: 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63  iCellFirst && pc
b4c0: 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  <=iCellLast );. 
b4d0: 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65 2d     size = pPage-
b4e0: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
b4f0: 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20  , &src[pc]);.   
b500: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20   cbrk -= size;. 
b510: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
b520: 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a  lFirst || pc+siz
b530: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
b540: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b550: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b560: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
b570: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
b580: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
b590: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
b5a0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
b5b0: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
b5c0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
b5d0: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
b5e0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
b5f0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
b600: 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20   cbrk);.    if( 
b610: 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  temp==0 ){.     
b620: 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66   int x;.      if
b630: 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e  ( cbrk==pc ) con
b640: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d  tinue;.      tem
b650: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
b660: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
b670: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
b680: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
b690: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
b6a0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74  .      memcpy(&t
b6b0: 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d  emp[x], &data[x]
b6c0: 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20  , (cbrk+size) - 
b6d0: 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20  x);.      src = 
b6e0: 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  temp;.    }.    
b6f0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72  memcpy(&data[cbr
b700: 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69  k], &src[pc], si
b710: 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ze);.  }.  asser
b720: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
b730: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
b740: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
b750: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
b760: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
b770: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
b780: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
b790: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
b7a0: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
b7b0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
b7c0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b7d0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
b7e0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
b7f0: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
b800: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
b810: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
b820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b830: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
b840: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b850: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
b860: 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69  arch the free-li
b870: 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66  st on page pPg f
b880: 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  or space to stor
b890: 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62  e a cell nByte b
b8a0: 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e  ytes in.** size.
b8b0: 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66   If one can be f
b8c0: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
b8d0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70  ointer to the sp
b8e0: 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  ace and remove i
b8f0: 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72  t.** from the fr
b900: 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ee-list..**.** I
b910: 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70  f no suitable sp
b920: 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ace can be found
b930: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
b940: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
b950: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
b960: 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63  ion may detect c
b970: 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e  orruption within
b980: 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70   pPg.  If corrup
b990: 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63  tion is.** detec
b9a0: 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73  ted then *pRc is
b9b0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43   set to SQLITE_C
b9c0: 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20  ORRUPT and NULL 
b9d0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
b9e0: 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20  ** Slots on the 
b9f0: 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 61  free list that a
ba00: 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  re between 1 and
ba10: 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72 20   3 bytes larger 
ba20: 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69  than nByte.** wi
ba30: 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69 66  ll be ignored if
ba40: 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74 72   adding the extr
ba50: 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20 66  a space to the f
ba60: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75  ragmentation cou
ba70: 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68 65  nt.** causes the
ba80: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
ba90: 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20 36  ount to exceed 6
baa0: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  0..*/.static u8 
bab0: 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65  *pageFindSlot(Me
bac0: 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  mPage *pPg, int 
bad0: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 29  nByte, int *pRc)
bae0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
baf0: 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
bb00: 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  et;.  u8 * const
bb10: 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
bb20: 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72  ata;.  int iAddr
bb30: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e   = hdr + 1;.  in
bb40: 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
bb50: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a  &aData[iAddr]);.
bb60: 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75    int x;.  int u
bb70: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
bb80: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
bb90: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e  ;..  assert( pc>
bba0: 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69  0 );.  do{.    i
bbb0: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
bbc0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
bbd0: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
bbe0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
bbf0: 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33 39 31 32  OF: R-06866-3912
bc00: 35 20 46 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  5 Freeblocks are
bc10: 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63 74 65   always connecte
bc20: 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a 20 20  d in order of.  
bc30: 20 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e 67 20    ** increasing 
bc40: 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69  offset. */.    i
bc50: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
bc60: 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34  -4 || pc<iAddr+4
bc70: 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d   ){.      *pRc =
bc80: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
bc90: 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
bca0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
bcb0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
bcc0: 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54 68  R-22710-53328 Th
bcd0: 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72  e third and four
bce0: 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  th bytes of each
bcf0: 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63  .    ** freebloc
bd00: 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64  k form a big-end
bd10: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
bd20: 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  h is the size of
bd30: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20   the freeblock. 
bd40: 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20     ** in bytes, 
bd50: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d  including the 4-
bd60: 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  byte header. */.
bd70: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
bd80: 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d  yte(&aData[pc+2]
bd90: 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d 20  );.    if( (x = 
bda0: 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30  size - nByte)>=0
bdb0: 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
bdc0: 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20  se( x==4 );.    
bdd0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
bde0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63   );.      if( pc
bdf0: 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f 66 66 73   < pPg->cellOffs
be00: 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20  et+2*pPg->nCell 
be10: 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61  || size+pc > usa
be20: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
be30: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
be40: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
be50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
be60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
be70: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
be80: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
be90: 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e  R-11498-58022 In
bea0: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62   a well-formed b
beb0: 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 20  -tree page, the 
bec0: 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  total.        **
bed0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
bee0: 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61   in fragments ma
bef0: 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e  y not exceed 60.
bf00: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
bf10: 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20  aData[hdr+7]>57 
bf20: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20  ) return 0;..   
bf30: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
bf40: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
bf50: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
bf60: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
bf70: 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67  .        ** frag
bf80: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74  mented bytes wit
bf90: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f  hin the page. */
bfa0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
bfb0: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26  &aData[iAddr], &
bfc0: 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20  aData[pc], 2);. 
bfd0: 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64 72         aData[hdr
bfe0: 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20  +7] += (u8)x;.  
bff0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c000: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
c010: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
c020: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
c030: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
c040: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  unt.         ** 
c050: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
c060: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
c070: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
c080: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
c090: 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  &aData[pc+2], x)
c0a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c0b0: 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63  return &aData[pc
c0c0: 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20   + x];.    }.   
c0d0: 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20 20   iAddr = pc;.   
c0e0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
c0f0: 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d 77  aData[pc]);.  }w
c100: 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20 20 72  hile( pc );..  r
c110: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
c120: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
c130: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
c140: 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
c150: 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73  B-Tree page pass
c160: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72  ed.** as the fir
c170: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69  st argument. Wri
c180: 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68  te into *pIdx th
c190: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
c1a0: 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f  ge->aData[].** o
c1b0: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
c1c0: 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70   of allocated sp
c1d0: 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68  ace. Return eith
c1e0: 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a  er SQLITE_OK or.
c1f0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
c200: 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45   (usually SQLITE
c210: 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a  _CORRUPT)..**.**
c220: 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72   The caller guar
c230: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72  antees that ther
c240: 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  e is sufficient 
c250: 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68  space to make th
c260: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  e.** allocation.
c270: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
c280: 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66  ight need to def
c290: 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  ragment in order
c2a0: 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c   to bring.** all
c2b0: 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74   the space toget
c2c0: 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54  her, however.  T
c2d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
c2e0: 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20   avoid using.** 
c2f0: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79  the first two by
c300: 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c  tes past the cel
c310: 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73  l pointer area s
c320: 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20  ince presumably 
c330: 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  this.** allocati
c340: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65  on is being made
c350: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73   in order to ins
c360: 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20  ert a new cell, 
c370: 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c  so we will.** al
c380: 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e  so end up needin
c390: 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  g a new cell poi
c3a0: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
c3b0: 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  int allocateSpac
c3c0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
c3d0: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74  , int nByte, int
c3e0: 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74   *pIdx){.  const
c3f0: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
c400: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
c410: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
c420: 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  f pPage->hdrOffs
c430: 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  et */.  u8 * con
c440: 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  st data = pPage-
c450: 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20  >aData;      /* 
c460: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
c470: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
c480: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
c4b0: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
c4c0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
c4d0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c4e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c4f0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
c500: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
c510: 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f  nt gap;        /
c520: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
c530: 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  gap between cell
c540: 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65   pointers and ce
c550: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
c560: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c570: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
c580: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
c590: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
c5a0: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
c5b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c5c0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
c5d0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
c5e0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
c5f0: 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  >=0 );  /* Minim
c600: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
c610: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  4 */.  assert( p
c620: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79  Page->nFree>=nBy
c630: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
c640: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
c650: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
c660: 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70   nByte < (int)(p
c670: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
c680: 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61  eSize-8) );..  a
c690: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65  ssert( pPage->ce
c6a0: 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20  llOffset == hdr 
c6b0: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
c6c0: 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20  leaf );.  gap = 
c6d0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
c6e0: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
c6f0: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61  ll;.  assert( ga
c700: 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a  p<=65536 );.  /*
c710: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
c720: 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20 74  29356-02391 If t
c730: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65 73  he database uses
c740: 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70 61   a 65536-byte pa
c750: 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64  ge size.  ** and
c760: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73 70   the reserved sp
c770: 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65  ace is zero (the
c780: 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72   usual value for
c790: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 29   reserved space)
c7a0: 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63  .  ** then the c
c7b0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73  ell content offs
c7c0: 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70  et of an empty p
c7d0: 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20  age wants to be 
c7e0: 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65  65536..  ** Howe
c7f0: 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65  ver, that intege
c800: 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  r is too large t
c810: 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61  o be stored in a
c820: 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   2-byte unsigned
c830: 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  .  ** integer, s
c840: 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69  o a value of 0 i
c850: 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c  s used in its pl
c860: 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  ace. */.  top = 
c870: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
c880: 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72 74  dr+5]);.  assert
c890: 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67  ( top<=(int)pPag
c8a0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
c8b0: 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74  ze ); /* Prevent
c8c0: 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50 61   by getAndInitPa
c8d0: 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67 61  ge() */.  if( ga
c8e0: 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  p>top ){.    if(
c8f0: 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67 65   top==0 && pPage
c900: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
c910: 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20 20  e==65536 ){.    
c920: 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20    top = 65536;. 
c930: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c940: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c950: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
c960: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
c970: 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73  here is enough s
c980: 70 61 63 65 20 62 65 74 77 65 65 6e 20 67 61 70  pace between gap
c990: 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65   and top for one
c9a0: 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74   more cell point
c9b0: 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20 65 6e  er.  ** array en
c9c0: 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e 64 20  try offset, and 
c9d0: 69 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  if the freelist 
c9e0: 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68  is not empty, th
c9f0: 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a 20 20  en search the.  
ca00: 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  ** freelist look
ca10: 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73  ing for a free s
ca20: 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74  lot big enough t
ca30: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 72 65  o satisfy the re
ca40: 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65  quest..  */.  te
ca50: 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74  stcase( gap+2==t
ca60: 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  op );.  testcase
ca70: 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a  ( gap+1==top );.
ca80: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d    testcase( gap=
ca90: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64  =top );.  if( (d
caa0: 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61  ata[hdr+2] || da
cab0: 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61  ta[hdr+1]) && ga
cac0: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
cad0: 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67  u8 *pSpace = pag
cae0: 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c  eFindSlot(pPage,
caf0: 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20   nByte, &rc);.  
cb00: 20 20 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a    if( pSpace ){.
cb10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
cb20: 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70  pace>=data && (p
cb30: 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35  Space - data)<65
cb40: 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49  536 );.      *pI
cb50: 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63  dx = (int)(pSpac
cb60: 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20  e - data);.     
cb70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cb80: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
cb90: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
cba0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
cbb0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75  }..  /* The requ
cbc0: 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  est could not be
cbd0: 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67   fulfilled using
cbe0: 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74   a freelist slot
cbf0: 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f  .  Check.  ** to
cc00: 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65   see if defragme
cc10: 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  ntation is neces
cc20: 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  sary..  */.  tes
cc30: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
cc40: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
cc50: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
cc60: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
cc70: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
cc80: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
cc90: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
cca0: 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  entPage(pPage);.
ccb0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
ccc0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
ccd0: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
cce0: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
ccf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
cd00: 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20  +nByte<=top );. 
cd10: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   }...  /* Alloca
cd20: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
cd30: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
cd40: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
cd50: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
cd60: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
cd70: 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74  nt area.  The bt
cd80: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61  reeInitPage() ca
cd90: 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  ll has already. 
cda0: 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68   ** validated th
cdb0: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76  e freelist.  Giv
cdc0: 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65  en that the free
cdd0: 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74  list is valid, t
cde0: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
cdf0: 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c  way that the all
ce00: 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65  ocation can exte
ce10: 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  nd off the end o
ce20: 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  f the page..  **
ce30: 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
ce40: 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65  low verifies the
ce50: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
ce60: 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d  ce..  */.  top -
ce70: 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  = nByte;.  put2b
ce80: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
ce90: 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74  , top);.  assert
cea0: 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28  ( top+nByte <= (
ceb0: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
cec0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
ced0: 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72  *pIdx = top;.  r
cee0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
cf00: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
cf10: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
cf20: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
cf30: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
cf40: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
cf50: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
cf60: 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a  ->aData[iStart].
cf70: 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ** and the size 
cf80: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20  of the block is 
cf90: 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  iSize bytes..**.
cfa0: 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65  ** Adjacent free
cfb0: 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65  blocks are coale
cfc0: 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  sced..**.** Note
cfd0: 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
cfe0: 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  h the freeblock 
cff0: 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64  list was checked
d000: 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67   by btreeInitPag
d010: 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75  e(),.** that rou
d020: 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65  tine will not de
d030: 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74  tect overlap bet
d040: 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72  ween cells or fr
d050: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a  eeblocks.  Nor.*
d060: 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74  * does it detect
d070: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
d080: 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75  ocks that encrou
d090: 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65  ch into the rese
d0a0: 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74  rved bytes.** at
d0b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
d0c0: 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64  page.  So do add
d0d0: 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69  itional corrupti
d0e0: 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65  on checks inside
d0f0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
d100: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
d110: 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
d120: 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66  y problems are f
d130: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
d140: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
d150: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31  mPage *pPage, u1
d160: 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69 53  6 iStart, u16 iS
d170: 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72  ize){.  u16 iPtr
d180: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d1a0: 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72 20   Address of ptr 
d1b0: 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  to next freebloc
d1c0: 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65  k */.  u16 iFree
d1d0: 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  Blk;            
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d1f0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  Address of the n
d200: 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
d210: 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20  .  u8 hdr;      
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d230: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
d240: 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30   header size.  0
d250: 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20   or 100 */.  u8 
d260: 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20  nFrag = 0;      
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d280: 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20     /* Reduction 
d290: 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  in fragmentation
d2a0: 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53   */.  u16 iOrigS
d2b0: 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20  ize = iSize;    
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d2d0: 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
d2e0: 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20   iSize */.  u32 
d2f0: 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70  iLast = pPage->p
d300: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
d310: 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73  ; /* Largest pos
d320: 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20  sible freeblock 
d330: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20  offset */.  u32 
d340: 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20  iEnd = iStart + 
d350: 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  iSize;          
d360: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
d370: 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74 20  past the iStart 
d380: 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69  buffer */.  unsi
d390: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
d3a0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
d3b0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e    /* Page conten
d3c0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
d3d0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
d3e0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d3f0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
d400: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
d410: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
d420: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53  CORRUPT_DB || iS
d430: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
d440: 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e  Offset+6+pPage->
d450: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a  childPtrSize );.
d460: 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
d470: 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20  T_DB || iEnd <= 
d480: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
d490: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
d4a0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d4b0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
d4c0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
d4d0: 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20  ssert( iSize>=4 
d4e0: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
d4f0: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
d500: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
d510: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20  rt<=iLast );..  
d520: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
d530: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
d540: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
d550: 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
d560: 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  te.  ** option i
d570: 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  s enabled */.  i
d580: 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62  f( pPage->pBt->b
d590: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
d5a0: 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
d5b0: 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
d5c0: 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a  iStart], 0, iSiz
d5d0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  e);.  }..  /* Th
d5e0: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  e list of freebl
d5f0: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
d600: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
d610: 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a    Find the .  **
d620: 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73   spot on the lis
d630: 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73  t where iStart s
d640: 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
d650: 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  d..  */.  hdr = 
d660: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d670: 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b  ;.  iPtr = hdr +
d680: 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69   1;.  if( data[i
d690: 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74  Ptr+1]==0 && dat
d6a0: 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20  a[iPtr]==0 ){.  
d6b0: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20    iFreeBlk = 0; 
d6c0: 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
d6d0: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
d6e0: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
d6f0: 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  mpty */.  }else{
d700: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72  .    while( (iFr
d710: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
d720: 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3e 30  (&data[iPtr]))>0
d730: 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69 53 74   && iFreeBlk<iSt
d740: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  art ){.      if(
d750: 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34   iFreeBlk<iPtr+4
d760: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d770: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
d780: 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72 65       iPtr = iFre
d790: 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eBlk;.    }.    
d7a0: 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c 61  if( iFreeBlk>iLa
d7b0: 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  st ) return SQLI
d7c0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d7d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72  .    assert( iFr
d7e0: 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46  eeBlk>iPtr || iF
d7f0: 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a  reeBlk==0 );.  .
d800: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
d810: 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20  oint:.    **    
d820: 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73  iFreeBlk:   Firs
d830: 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65  t freeblock afte
d840: 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72  r iStart, or zer
d850: 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a  o if none.    **
d860: 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20      iPtr:       
d870: 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61  The address of a
d880: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72 65   pointer to iFre
d890: 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eBlk.    **.    
d8a0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
d8b0: 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75  if iFreeBlk shou
d8c0: 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20  ld be coalesced 
d8d0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
d8e0: 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20  iStart..    */. 
d8f0: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20     if( iFreeBlk 
d900: 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65  && iEnd+3>=iFree
d910: 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72  Blk ){.      nFr
d920: 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20  ag = iFreeBlk - 
d930: 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  iEnd;.      if( 
d940: 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20  iEnd>iFreeBlk ) 
d950: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d960: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d970: 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42 6c    iEnd = iFreeBl
d980: 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  k + get2byte(&da
d990: 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b  ta[iFreeBlk+2]);
d9a0: 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 20  .      if( iEnd 
d9b0: 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  > pPage->pBt->us
d9c0: 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74 75 72  ableSize ) retur
d9d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d9e0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 53 69  _BKPT;.      iSi
d9f0: 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61  ze = iEnd - iSta
da00: 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42  rt;.      iFreeB
da10: 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
da20: 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a  ata[iFreeBlk]);.
da30: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
da40: 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68  If iPtr is anoth
da50: 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68  er freeblock (th
da60: 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69  at is, if iPtr i
da70: 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69  s not the freeli
da80: 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65  st.    ** pointe
da90: 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65  r in the page he
daa0: 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b  ader) then check
dab0: 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72   to see if iStar
dac0: 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20  t should be.    
dad0: 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  ** coalesced ont
dae0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74  o the end of iPt
daf0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
db00: 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a  ( iPtr>hdr+1 ){.
db10: 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e        int iPtrEn
db20: 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62  d = iPtr + get2b
db30: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32  yte(&data[iPtr+2
db40: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ]);.      if( iP
db50: 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20  trEnd+3>=iStart 
db60: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
db70: 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20  PtrEnd>iStart ) 
db80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
db90: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
dba0: 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74      nFrag += iSt
dbb0: 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20  art - iPtrEnd;. 
dbc0: 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69         iSize = i
dbd0: 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20  End - iPtr;.    
dbe0: 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50 74      iStart = iPt
dbf0: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
dc00: 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64  .    if( nFrag>d
dc10: 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74  ata[hdr+7] ) ret
dc20: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
dc30: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61 74  PT_BKPT;.    dat
dc40: 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61  a[hdr+7] -= nFra
dc50: 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 74  g;.  }.  if( iSt
dc60: 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26 64  art==get2byte(&d
dc70: 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20  ata[hdr+5]) ){. 
dc80: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72     /* The new fr
dc90: 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68  eeblock is at th
dca0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
dcb0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
dcc0: 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20  area,.    ** so 
dcd0: 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65 20  just extend the 
dce0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
dcf0: 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 72  a rather than cr
dd00: 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20  eate another.   
dd10: 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74   ** freelist ent
dd20: 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50  ry */.    if( iP
dd30: 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75  tr!=hdr+1 ) retu
dd40: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
dd50: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74 32  T_BKPT;.    put2
dd60: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
dd70: 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20  ], iFreeBlk);.  
dd80: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
dd90: 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a  [hdr+5], iEnd);.
dda0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
ddb0: 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66  Insert the new f
ddc0: 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68  reeblock into th
ddd0: 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
dde0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ddf0: 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b  [iPtr], iStart);
de00: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
de10: 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72  ata[iStart], iFr
de20: 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32  eeBlk);.    put2
de30: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
de40: 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20  t+2], iSize);.  
de50: 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  }.  pPage->nFree
de60: 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20   += iOrigSize;. 
de70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
de80: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  K;.}../*.** Deco
de90: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
dea0: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
deb0: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
dec0: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
ded0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
dee0: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
def0: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
df00: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
df10: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
df20: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
df30: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
df40: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
df50: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
df60: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
df70: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
df80: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
df90: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
dfa0: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
dfb0: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
dfc0: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
dfd0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
dfe0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
dff0: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
e000: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
e010: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
e020: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
e030: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
e040: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
e050: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
e060: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
e070: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
e080: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
e090: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
e0a0: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
e0b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e0c0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e0d0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
e0e0: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
e0f0: 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79  af = (u8)(flagBy
e100: 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28  te>>3);  assert(
e110: 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c   PTF_LEAF == 1<<
e120: 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20  3 );.  flagByte 
e130: 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20  &= ~PTF_LEAF;.  
e140: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
e150: 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d  ize = 4-4*pPage-
e160: 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e  >leaf;.  pPage->
e170: 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c  xCellSize = cell
e180: 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20 3d  SizePtr;.  pBt =
e190: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
e1a0: 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54  f( flagByte==(PT
e1b0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
e1c0: 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20  _INTKEY) ){.    
e1d0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
e1e0: 52 2d 30 33 36 34 30 2d 31 33 34 31 35 20 41 20  R-03640-13415 A 
e1f0: 76 61 6c 75 65 20 6f 66 20 35 20 6d 65 61 6e 73  value of 5 means
e200: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 20   the page is an 
e210: 69 6e 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20  interior.    ** 
e220: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67  table b-tree pag
e230: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
e240: 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  ( (PTF_LEAFDATA|
e250: 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29  PTF_INTKEY)==5 )
e260: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
e270: 45 2d 4f 46 3a 20 52 2d 32 30 35 30 31 2d 36 31  E-OF: R-20501-61
e280: 37 39 36 20 41 20 76 61 6c 75 65 20 6f 66 20 31  796 A value of 1
e290: 33 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  3 means the page
e2a0: 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20 20 2a   is a leaf.    *
e2b0: 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70  * table b-tree p
e2c0: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
e2d0: 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54  rt( (PTF_LEAFDAT
e2e0: 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  A|PTF_INTKEY|PTF
e2f0: 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20  _LEAF)==13 );.  
e300: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
e310: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 1;.    if( pPa
e320: 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
e330: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
e340: 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  eaf = 1;.      p
e350: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20  Page->noPayload 
e360: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
e370: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
e380: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
e390: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e3a0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
e3b0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
e3c0: 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64  pPage->noPayload
e3d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67   = 1;.      pPag
e3e0: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63  e->xCellSize = c
e3f0: 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c  ellSizePtrNoPayl
e400: 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61 67 65  oad;.      pPage
e410: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
e420: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
e430: 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 7d  NoPayload;.    }
e440: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
e450: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
e460: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
e470: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
e480: 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65  minLeaf;.  }else
e490: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50   if( flagByte==P
e4a0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20  TF_ZERODATA ){. 
e4b0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e4c0: 46 3a 20 52 2d 32 37 32 32 35 2d 35 33 39 33 36  F: R-27225-53936
e4d0: 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20 6d 65   A value of 2 me
e4e0: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
e4f0: 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20 20 20  an interior.    
e500: 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  ** index b-tree 
e510: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
e520: 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41  ert( (PTF_ZERODA
e530: 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a  TA)==2 );.    /*
e540: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
e550: 31 36 35 37 31 2d 31 31 36 31 35 20 41 20 76 61  16571-11615 A va
e560: 6c 75 65 20 6f 66 20 31 30 20 6d 65 61 6e 73 20  lue of 10 means 
e570: 74 68 65 20 70 61 67 65 20 69 73 20 61 20 6c 65  the page is a le
e580: 61 66 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  af.    ** index 
e590: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
e5a0: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
e5b0: 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45  _ZERODATA|PTF_LE
e5c0: 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70  AF)==10 );.    p
e5d0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
e5e0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
e5f0: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
e600: 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61   pPage->noPayloa
e610: 64 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  d = 0;.    pPage
e620: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
e630: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
e640: 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65  Index;.    pPage
e650: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
e660: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
e670: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
e680: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
e690: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
e6a0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
e6b0: 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20  47608-56469 Any 
e6c0: 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20  other value for 
e6d0: 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
e6e0: 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61  type is.    ** a
e6f0: 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20  n error. */.    
e700: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e710: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
e720: 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74    pPage->max1byt
e730: 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e  ePayload = pBt->
e740: 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b  max1bytePayload;
e750: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e760: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
e770: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78  itialize the aux
e780: 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  iliary informati
e790: 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c  on for a disk bl
e7a0: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ock..**.** Retur
e7b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
e7c0: 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73  uccess.  If we s
e7d0: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
e7e0: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
e7f0: 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  tain a well-form
e800: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
e810: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a  , then return .*
e820: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
e830: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72  .  Note that a r
e840: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
e850: 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67  OK does not.** g
e860: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
e870: 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66  e page is well-f
e880: 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20  ormed.  It only 
e890: 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65  shows that.** we
e8a0: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
e8b0: 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  t any corruption
e8c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e8d0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65  btreeInitPage(Me
e8e0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a  mPage *pPage){..
e8f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
e900: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
e910: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
e920: 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  >db!=0 );.  asse
e930: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e940: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
e950: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
e960: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
e970: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
e980: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
e990: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
e9a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
e9b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
e9c0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
e9d0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
e9e0: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
e9f0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
ea00: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
ea10: 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28  bPage) );..  if(
ea20: 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20   !pPage->isInit 
ea30: 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20  ){.    u16 pc;  
ea40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
ea50: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
ea60: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
ea70: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20  ->aData[] */.   
ea80: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
ea90: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
eaa0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
eab0: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  ge header */.   
eac0: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
ead0: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
eae0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
eaf0: 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
eb00: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
eb10: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
eb20: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74  cture */.    int
eb30: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
eb40: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
eb50: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
eb60: 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31  h page */.    u1
eb70: 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  6 cellOffset;   
eb80: 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20   /* Offset from 
eb90: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f  start of page to
eba0: 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
ebb0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
ebc0: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
ebd0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
ebe0: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
ebf0: 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  age */.    int t
ec00: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
ec10: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
ec20: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
ec30: 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20  area */.    int 
ec40: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f  iCellFirst;    /
ec50: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
ec60: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
ec70: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
ec80: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
ec90: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
eca0: 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  sible cell or fr
ecb0: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
ecc0: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
ecd0: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
ece0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
ecf0: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
ed00: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
ed10: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
ed20: 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30  F: R-28594-02890
ed30: 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c   The one-byte fl
ed40: 61 67 20 61 74 20 6f 66 66 73 65 74 20 30 20 69  ag at offset 0 i
ed50: 6e 64 69 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a  ndicating.    **
ed60: 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
ed70: 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20 20 69 66   type. */.    if
ed80: 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50  ( decodeFlags(pP
ed90: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20  age, data[hdr]) 
eda0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
edb0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
edc0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
edd0: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
ede0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
edf0: 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67  5536 );.    pPag
ee00: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
ee10: 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
ee20: 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67  e - 1);.    pPag
ee30: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
ee40: 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
ee50: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
ee60: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63  ze;.    pPage->c
ee70: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c  ellOffset = cell
ee80: 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 38  Offset = hdr + 8
ee90: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
eea0: 74 72 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  trSize;.    pPag
eeb0: 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
eec0: 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b  ata[usableSize];
eed0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 43 65 6c  .    pPage->aCel
eee0: 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c  lIdx = &data[cel
eef0: 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 50  lOffset];.    pP
ef00: 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d  age->aDataOfst =
ef10: 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68   &data[pPage->ch
ef20: 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 20  ildPtrSize];.   
ef30: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
ef40: 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54   R-58015-48175 T
ef50: 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
ef60: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20  ger at offset 5 
ef70: 64 65 73 69 67 6e 61 74 65 73 0a 20 20 20 20 2a  designates.    *
ef80: 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  * the start of t
ef90: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
efa0: 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c  area. A zero val
efb0: 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65  ue for this inte
efc0: 67 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e  ger is.    ** in
efd0: 74 65 72 70 72 65 74 65 64 20 61 73 20 36 35 35  terpreted as 655
efe0: 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f 70 20 3d  36. */.    top =
eff0: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
f000: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
f010: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
f020: 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37  OF: R-37002-3277
f030: 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  4 The two-byte i
f040: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
f050: 20 33 20 67 69 76 65 73 20 74 68 65 0a 20 20 20   3 gives the.   
f060: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65   ** number of ce
f070: 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  lls on the page.
f080: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   */.    pPage->n
f090: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
f0a0: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
f0b0: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43     if( pPage->nC
f0c0: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
f0d0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20   ){.      /* To 
f0e0: 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  many cells for a
f0f0: 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54   single page.  T
f100: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
f110: 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20  corrupt */.     
f120: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
f130: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
f140: 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
f150: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d   pPage->nCell==M
f160: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20  X_CELL(pBt) );. 
f170: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f180: 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39  F: R-24089-57979
f190: 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61   If a page conta
f1a0: 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68  ins no cells (wh
f1b0: 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20  ich is only.    
f1c0: 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ** possible for 
f1d0: 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  a root page of a
f1e0: 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74   table that cont
f1f0: 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68  ains no rows) th
f200: 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 66  en the.    ** of
f210: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
f220: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69   content area wi
f230: 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67  ll equal the pag
f240: 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65  e size minus the
f250: 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
f260: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 2e   reserved space.
f270: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
f280: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
f290: 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a  | top==usableSiz
f2a0: 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  e || CORRUPT_DB 
f2b0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c  );..    /* A mal
f2c0: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
f2d0: 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65  page might cause
f2e0: 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74   us to read past
f2f0: 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20   the end.    ** 
f300: 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72  of page when par
f310: 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20  sing a cell.  . 
f320: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
f330: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
f340: 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
f350: 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
f360: 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
f370: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
f380: 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75  nd of a page bou
f390: 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73  ndary and causes
f3a0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
f3b0: 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65  to be .    ** re
f3c0: 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65  turned if it doe
f3d0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43  s..    */.    iC
f3e0: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
f3f0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
f400: 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c  >nCell;.    iCel
f410: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
f420: 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69 66 28 20  ze - 4;.    if( 
f430: 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  pBt->db->flags &
f440: 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65   SQLITE_CellSize
f450: 43 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  Ck ){.      int 
f460: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
f470: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
f480: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
f490: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
f4a0: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
f4b0: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
f4c0: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
f4d0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
f4e0: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
f4f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
f500: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
f510: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
f520: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74  byteAligned(&dat
f530: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32  a[cellOffset+i*2
f540: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
f550: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
f560: 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  irst );.        
f570: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
f580: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20  ellLast );.     
f590: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
f5a0: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
f5b0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
f5c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f5d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
f5e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f5f0: 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c  sz = pPage->xCel
f600: 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61  lSize(pPage, &da
f610: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20  ta[pc]);.       
f620: 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
f630: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
f640: 20 20 20 20 20 20 20 20 69 66 28 20 70 63 2b 73          if( pc+s
f650: 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  z>usableSize ){.
f660: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f670: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f680: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
f690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f6a0: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
f6b0: 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20   iCellLast++;.  
f6c0: 20 20 7d 20 20 0a 0a 20 20 20 20 2f 2a 20 43 6f    }  ..    /* Co
f6d0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
f6e0: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
f6f0: 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 45 56  e page.    ** EV
f700: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35  IDENCE-OF: R-235
f710: 38 38 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f  88-34450 The two
f720: 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
f730: 20 6f 66 66 73 65 74 20 31 20 67 69 76 65 73 20   offset 1 gives 
f740: 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  the.    ** start
f750: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 72   of the first fr
f760: 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  eeblock on the p
f770: 61 67 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20  age, or is zero 
f780: 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  if there are no.
f790: 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b      ** freeblock
f7a0: 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67  s. */.    pc = g
f7b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
f7c0: 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65  r+1]);.    nFree
f7d0: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
f7e0: 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e   top;  /* Init n
f7f0: 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65  Free to non-free
f800: 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65  block free space
f810: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
f820: 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36  c>0 ){.      u16
f830: 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20   next, size;.   
f840: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
f850: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
f860: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
f870: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
f880: 52 2d 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e  R-55530-52930 In
f890: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62   a well-formed b
f8a0: 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 72  -tree page, ther
f8b0: 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 2a  e will.        *
f8c0: 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c  * always be at l
f8d0: 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65  east one cell be
f8e0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 66  fore the first f
f8f0: 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  reeblock..      
f900: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
f910: 4f 72 2c 20 74 68 65 20 66 72 65 65 62 6c 6f 63  Or, the freebloc
f920: 6b 20 69 73 20 6f 66 66 20 74 68 65 20 65 6e 64  k is off the end
f930: 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 20   of the page.   
f940: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
f950: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f960: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
f970: 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20     }.      next 
f980: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
f990: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a  [pc]);.      siz
f9a0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
f9b0: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
f9c0: 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20   if( (next>0 && 
f9d0: 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29  next<=pc+size+3)
f9e0: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
f9f0: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
fa00: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73    /* Free blocks
fa10: 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65   must be in asce
fa20: 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64  nding order. And
fa30: 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
fa40: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
fa50: 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74   free-block must
fa60: 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61   lie on the data
fa70: 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  base page.  */. 
fa80: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
fa90: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
faa0: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
fab0: 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
fac0: 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  + size;.      pc
fad0: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a   = next;.    }..
fae0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
faf0: 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
fb00: 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
fb10: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
fb20: 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f  e start.    ** o
fb30: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
fb40: 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
fb50: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
fb60: 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20  bytes within.   
fb70: 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
fb80: 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
fb90: 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
fba0: 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
fbb0: 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ze.    ** of the
fbc0: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
fbd0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
fbe0: 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
fbf0: 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73  ck also.    ** s
fc00: 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20  erves to verify 
fc10: 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20  that the offset 
fc20: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
fc30: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
fc40: 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63  .    ** area, ac
fc50: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70  cording to the p
fc60: 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73  age header, lies
fc70: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
fc80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fc90: 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
fca0: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
fcb0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
fcc0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
fcd0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
fce0: 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
fcf0: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20  CellFirst);.    
fd00: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
fd10: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
fd20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
fd30: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
fd40: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
fd50: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
fd60: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
fd70: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
fd80: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
fd90: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
fda0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
fdb0: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
fdc0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
fdd0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
fde0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
fdf0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
fe00: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
fe10: 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
fe20: 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
fe30: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
fe40: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
fe50: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
fe60: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
fe70: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
fe80: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
fe90: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
fea0: 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
feb0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
fec0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
fed0: 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
fee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fef0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
ff00: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
ff10: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
ff20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
ff30: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
ff40: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  );.  if( pBt->bt
ff50: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
ff60: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
ff70: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
ff80: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
ff90: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
ffa0: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
ffb0: 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
ffc0: 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28   first = hdr + (
ffd0: 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
ffe0: 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20  ==0 ? 12 : 8);. 
fff0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
10000 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
10010 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
10020 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
10030 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
10040 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
10050 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
10060 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
10070 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65  e - first);.  de
10080 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
10090 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65   flags);.  pPage
100a0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
100b0 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61  irst;.  pPage->a
100c0 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
100d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
100e0 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c  ;.  pPage->aCell
100f0 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73  Idx = &data[firs
10100 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  t];.  pPage->aDa
10110 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70  taOfst = &data[p
10120 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
10130 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f  ze];.  pPage->nO
10140 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61  verflow = 0;.  a
10150 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
10160 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
10170 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
10180 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61  6 );.  pPage->ma
10190 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
101a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
101b0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
101c0 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  l = 0;.  pPage->
101d0 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a  isInit = 1;.}...
101e0 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
101f0 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20  DbPage obtained 
10200 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69  from the pager i
10210 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73  nto a MemPage us
10220 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72  ed by.** the btr
10230 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  ee layer..*/.sta
10240 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
10250 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
10260 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
10270 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53  , Pgno pgno, BtS
10280 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
10290 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
102a0 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65  (MemPage*)sqlite
102b0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
102c0 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70  DbPage);.  if( p
102d0 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  gno!=pPage->pgno
102e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   ){.    pPage->a
102f0 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
10300 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
10310 67 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ge);.    pPage->
10320 70 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  pDbPage = pDbPag
10330 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42  e;.    pPage->pB
10340 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61  t = pBt;.    pPa
10350 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
10360 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  .    pPage->hdrO
10370 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20  ffset = pgno==1 
10380 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20  ? 100 : 0;.  }. 
10390 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
103a0 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
103b0 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
103c0 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
103d0 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
103e0 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
103f0 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
10400 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
10410 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
10420 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
10430 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
10440 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65    See also: btre
10450 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 29  eGetUnusedPage()
10460 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
10470 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
10480 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  NT flag is set, 
10490 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
104a0 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20   do not care.** 
104b0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
104c0 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
104d0 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
104e0 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
104f0 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
10500 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
10510 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
10520 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
10530 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
10540 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
10550 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
10560 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
10570 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
10580 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
10590 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
105a0 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
105b0 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
105c0 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
105d0 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
105e0 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
105f0 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61  c int btreeGetPa
10600 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
10610 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
10620 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
10630 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
10640 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
10650 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
10660 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
10670 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
10680 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
10690 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
106a0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
106b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
106c0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
106d0 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
106e0 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
106f0 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
10700 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73  *pDbPage;..  ass
10710 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
10720 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
10730 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66  T_NOCONTENT || f
10740 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f  lags==PAGER_GET_
10750 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73  READONLY );.  as
10760 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10770 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
10780 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  tex) );.  rc = s
10790 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
107a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
107b0 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
107c0 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
107d0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
107e0 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  rc;.  *ppPage = 
107f0 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
10800 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
10810 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72  o, pBt);.  retur
10820 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10830 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
10840 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
10850 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
10860 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
10870 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65  e is not.** alre
10880 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72  ady in the pager
10890 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55   cache return NU
108a0 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  LL. Initialize t
108b0 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
108c0 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
108d0 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
108e0 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
108f0 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
10900 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61  PageLookup(BtSha
10910 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
10920 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
10930 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
10940 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10950 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
10960 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  ) );.  pDbPage =
10970 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
10980 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
10990 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
109a0 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  bPage ){.    ret
109b0 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f  urn btreePageFro
109c0 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
109d0 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d   pgno, pBt);.  }
109e0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
109f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
10a00 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
10a10 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
10a20 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  ges. If there is
10a30 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20   any kind of.** 
10a40 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28  error, return ((
10a50 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29  unsigned int)-1)
10a60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
10a70 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
10a80 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
10a90 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50    return pBt->nP
10aa0 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  age;.}.u32 sqlit
10ab0 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28  e3BtreeLastPage(
10ac0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
10ad0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
10ae0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
10af0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d  ;.  assert( ((p-
10b00 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38  >pBt->nPage)&0x8
10b10 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20  000000)==0 );.  
10b20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
10b30 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d  count(p->pBt);.}
10b40 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
10b50 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
10b60 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
10b70 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43   it..**.** If pC
10b80 75 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70  ur!=0 then the p
10b90 61 67 65 20 69 73 20 62 65 69 6e 67 20 66 65 74  age is being fet
10ba0 63 68 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ched as part of 
10bb0 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a  a moveToChild().
10bc0 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64  ** call.  Do add
10bd0 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63  itional sanity c
10be0 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
10bf0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
10c00 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20  ..** And if the 
10c10 66 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69  fetch fails, thi
10c20 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64  s routine must d
10c30 65 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69  ecrement pCur->i
10c40 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Page..**.** The 
10c50 70 61 67 65 20 69 73 20 66 65 74 63 68 65 64 20  page is fetched 
10c60 61 73 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e  as read-write un
10c70 6c 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74  less pCur is not
10c80 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20   NULL and is.** 
10c90 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
10ca0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  or..**.** If an 
10cb0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
10cc0 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e  en *ppPage is un
10cd0 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d  defined. It.** m
10ce0 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e  ay remain unchan
10cf0 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62  ged, or it may b
10d00 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61  e set to an inva
10d10 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  lid value..*/.st
10d20 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
10d30 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
10d40 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
10d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10d60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
10d70 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10da0 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
10db0 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
10dc0 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
10dd0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
10de0 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
10df0 20 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72   here */.  BtCur
10e00 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
10e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
10e20 72 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20  rsor to receive 
10e30 74 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c  the page, or NUL
10e40 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64  L */.  int bRead
10e50 4f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20 20  Only            
10e60 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
10e70 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70  or a read-only p
10e80 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  age */.){.  int 
10e90 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
10ea0 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
10eb0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10ec0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
10ed0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
10ee0 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d  r==0 || ppPage==
10ef0 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  &pCur->apPage[pC
10f00 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
10f10 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
10f20 7c 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43  || bReadOnly==pC
10f30 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
10f40 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  s );.  assert( p
10f50 43 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  Cur==0 || pCur->
10f60 69 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66  iPage>0 );..  if
10f70 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  ( pgno>btreePage
10f80 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
10f90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
10fa0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
10fb0 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
10fc0 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  age_error;.  }. 
10fd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10fe0 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
10ff0 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65  r, pgno, (DbPage
11000 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52 65  **)&pDbPage, bRe
11010 61 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72  adOnly);.  if( r
11020 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65  c ){.    goto ge
11030 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
11040 6f 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  or;.  }.  *ppPag
11050 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71  e = (MemPage*)sq
11060 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
11070 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69  ra(pDbPage);.  i
11080 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  f( (*ppPage)->is
11090 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62  Init==0 ){.    b
110a0 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
110b0 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
110c0 2c 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  , pBt);.    rc =
110d0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a   btreeInitPage(*
110e0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  ppPage);.    if(
110f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11100 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
11110 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
11120 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
11130 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
11140 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
11150 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67  t( (*ppPage)->pg
11160 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73  no==pgno );.  as
11170 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d  sert( (*ppPage)-
11180 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50  >aData==sqlite3P
11190 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
111a0 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  age) );..  /* If
111b0 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69   obtaining a chi
111c0 6c 64 20 70 61 67 65 20 66 6f 72 20 61 20 63 75  ld page for a cu
111d0 72 73 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65  rsor, we must ve
111e0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61  rify that the pa
111f0 67 65 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61  ge is.  ** compa
11200 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 72  tible with the r
11210 6f 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69  oot page. */.  i
11220 66 28 20 70 43 75 72 20 26 26 20 28 28 2a 70 70  f( pCur && ((*pp
11230 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c  Page)->nCell<1 |
11240 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74  | (*ppPage)->int
11250 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e  Key!=pCur->curIn
11260 74 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20  tKey) ){.    rc 
11270 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
11280 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 6c 65 61  _BKPT;.    relea
11290 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
112a0 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64  .    goto getAnd
112b0 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a  InitPage_error;.
112c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
112d0 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49  ITE_OK;..getAndI
112e0 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20  nitPage_error:. 
112f0 20 69 66 28 20 70 43 75 72 20 29 20 70 43 75 72   if( pCur ) pCur
11300 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73  ->iPage--;.  tes
11310 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29  tcase( pgno==0 )
11320 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
11330 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
11340 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72  E_CORRUPT );.  r
11350 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11360 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
11370 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
11380 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
11390 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
113a0 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  .** call to btre
113b0 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  eGetPage..*/.sta
113c0 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
113d0 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50  PageNotNull(MemP
113e0 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61  age *pPage){.  a
113f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
11400 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
11410 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
11420 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
11430 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  pDbPage!=0 );.  
11440 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
11450 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
11460 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
11470 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
11480 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11490 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
114a0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
114b0 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
114c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
114d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
114e0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
114f0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
11500 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61  UnrefNotNull(pPa
11510 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ge->pDbPage);.}.
11520 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
11530 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
11540 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
11550 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61  Page ) releasePa
11560 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29  geNotNull(pPage)
11570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
11580 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a  n unused page..*
11590 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20  *.** This works 
115a0 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47  just like btreeG
115b0 65 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68  etPage() with th
115c0 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a  e addition:.**.*
115d0 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61  *   *  If the pa
115e0 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
115f0 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74   use for some ot
11600 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d  her purpose, imm
11610 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20  ediately.**     
11620 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20   release it and 
11630 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
11640 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a  _CURRUPT error..
11650 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72  **   *  Make sur
11660 65 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61  e the isInit fla
11670 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74  g is clear.*/.st
11680 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
11690 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42  tUnusedPage(.  B
116a0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
116b0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
116c0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
116d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
116e0 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
116f0 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d   to fetch */.  M
11700 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
11710 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
11720 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70  e page in this p
11730 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e  arameter */.  in
11740 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
11750 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
11760 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47  NOCONTENT or PAG
11770 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
11780 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
11790 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
117a0 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
117b0 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
117c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
117d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
117e0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
117f0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
11800 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  age)>1 ){.      
11810 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
11820 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50  age);.      *ppP
11830 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
11840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
11850 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
11860 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e  .    (*ppPage)->
11870 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65  isInit = 0;.  }e
11880 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
11890 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
118a0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
118b0 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
118c0 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
118d0 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
118e0 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
118f0 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
11900 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
11910 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
11920 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
11930 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
11940 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
11950 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
11960 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
11970 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
11980 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
11990 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
119a0 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
119b0 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
119c0 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
119d0 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
119e0 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
119f0 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
11a00 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
11a10 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20  Page *pData){.  
11a20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
11a30 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
11a40 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
11a50 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
11a60 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11a70 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
11a80 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b  ount(pData)>0 );
11a90 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
11aa0 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Init ){.    asse
11ab0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11ac0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
11ad0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
11ae0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
11af0 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
11b00 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
11b10 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b  ount(pData)>1 ){
11b20 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20  .      /* pPage 
11b30 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62  might not be a b
11b40 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d  tree page;  it m
11b50 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66  ight be an overf
11b60 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
11b70 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65  * or ptrmap page
11b80 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e   or a free page.
11b90 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73    In those cases
11ba0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
11bb0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f        ** call to
11bc0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
11bd0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74   will likely ret
11be0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
11bf0 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74  PT..      ** But
11c00 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65   no harm is done
11c10 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69   by this.  And i
11c20 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74  t is very import
11c30 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a  ant that.      *
11c40 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  * btreeInitPage(
11c50 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65  ) be called on e
11c60 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20  very btree page 
11c70 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20  so we make.     
11c80 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72   ** the call for
11c90 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
11ca0 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65   comes in for re
11cb0 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20  -initing. */.   
11cc0 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
11cd0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
11ce0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
11cf0 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
11d00 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e  ler for a btree.
11d10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
11d20 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
11d30 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67  ndler(void *pArg
11d40 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
11d50 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29  Bt = (BtShared*)
11d60 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
11d70 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73  pBt->db );.  ass
11d80 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
11d90 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d  ex_held(pBt->db-
11da0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
11db0 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  urn sqlite3Invok
11dc0 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42  eBusyHandler(&pB
11dd0 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  t->db->busyHandl
11de0 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  er);.}../*.** Op
11df0 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
11e00 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65  le..** .** zFile
11e10 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
11e20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11e30 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65   file.  If zFile
11e40 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  name is NULL.** 
11e50 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  then an ephemera
11e60 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  l database is cr
11e70 65 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65  eated.  The ephe
11e80 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d  meral database m
11e90 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75  ight.** be exclu
11ea0 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79  sively in memory
11eb0 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73  , or it might us
11ec0 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d  e a disk-based m
11ed0 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20  emory cache..** 
11ee0 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
11ef0 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
11f00 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  se will be autom
11f10 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
11f20 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65   .** when sqlite
11f30 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
11f40 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
11f50 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
11f60 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
11f70 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
11f80 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
11f90 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
11fa0 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
11fb0 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
11fc0 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
11fd0 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65  "flags" paramete
11fe0 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
11ff0 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  hat might contai
12000 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42  n bits like.** B
12010 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  TREE_OMIT_JOURNA
12020 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d  L and/or BTREE_M
12030 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  EMORY..**.** If 
12040 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
12050 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
12060 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
12070 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
12080 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
12090 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
120a0 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
120b0 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
120c0 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
120d0 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
120e0 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
120f0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
12100 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
12110 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
12120 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
12130 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
12140 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
12150 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
12160 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
12170 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
12180 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
12190 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20  fs,      /* VFS 
121a0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
121b0 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73  b-tree */.  cons
121c0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
121d0 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
121e0 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
121f0 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
12200 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
12210 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
12220 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
12230 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
12240 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
12250 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
12260 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
12270 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
12280 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
12290 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
122a0 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
122b0 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
122c0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
122d0 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
122e0 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
122f0 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
12300 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
12310 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pBt = 0;        
12320 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
12330 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
12340 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
12350 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
12360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
12370 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
12380 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
12390 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30  x *mutexOpen = 0
123a0 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61  ;  /* Prevents a
123b0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e   race condition.
123c0 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f   Ticket #3537 */
123d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
123e0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
123f0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
12400 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
12410 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73  ion */.  u8 nRes
12420 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
12430 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
12440 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
12450 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
12460 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
12470 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20  zDbHeader[100]; 
12480 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61   /* Database hea
12490 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  der content */..
124a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65    /* True if ope
124b0 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ning an ephemera
124c0 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  l, temporary dat
124d0 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
124e0 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20   int isTempDb = 
124f0 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
12500 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b  zFilename[0]==0;
12510 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
12520 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
12530 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
12540 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
12550 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
12560 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
12570 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
12580 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
12590 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
125a0 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
125b0 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63  b = 0;.#else.  c
125c0 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
125d0 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26   = (zFilename &&
125e0 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
125f0 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  e, ":memory:")==
12600 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
12610 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73            || (is
12620 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65  TempDb && sqlite
12630 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62  3TempInMemory(db
12640 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
12650 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66            || (vf
12660 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
12670 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b  OPEN_MEMORY)!=0;
12680 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
12690 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
126a0 73 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b  sert( pVfs!=0 );
126b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
126c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
126d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
126e0 73 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66  sert( (flags&0xf
126f0 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f  f)==flags );   /
12700 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38  * flags fit in 8
12710 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   bits */..  /* O
12720 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47  nly a BTREE_SING
12730 4c 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  LE database can 
12740 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  be BTREE_UNORDER
12750 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ED */.  assert( 
12760 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55  (flags & BTREE_U
12770 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20  NORDERED)==0 || 
12780 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53  (flags & BTREE_S
12790 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20  INGLE)!=0 );..  
127a0 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c  /* A BTREE_SINGL
127b0 45 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  E database is al
127c0 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79  ways a temporary
127d0 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61   and/or ephemera
127e0 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
127f0 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
12800 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65  NGLE)==0 || isTe
12810 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69  mpDb );..  if( i
12820 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c  sMemdb ){.    fl
12830 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d  ags |= BTREE_MEM
12840 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  ORY;.  }.  if( (
12850 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
12860 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21  E_OPEN_MAIN_DB)!
12870 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c  =0 && (isMemdb |
12880 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20  | isTempDb) ){. 
12890 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76     vfsFlags = (v
128a0 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54  fsFlags & ~SQLIT
128b0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
128c0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  | SQLITE_OPEN_TE
128d0 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d  MP_DB;.  }.  p =
128e0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
128f0 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29  ro(sizeof(Btree)
12900 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
12910 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12920 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d  _NOMEM;.  }.  p-
12930 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
12940 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
12950 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   db;.#ifndef SQL
12960 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
12970 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e  CACHE.  p->lock.
12980 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d  pBtree = p;.  p-
12990 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31  >lock.iTable = 1
129a0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ;.#endif..#if !d
129b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
129c0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
129d0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
129e0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
129f0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
12a00 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
12a10 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
12a20 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
12a30 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
12a40 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
12a50 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
12a60 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
12a70 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44  */.  if( isTempD
12a80 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  b==0 && (isMemdb
12a90 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73  ==0 || (vfsFlags
12aa0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  &SQLITE_OPEN_URI
12ab0 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )!=0) ){.    if(
12ac0 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49   vfsFlags & SQLI
12ad0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
12ae0 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  CHE ){.      int
12af0 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   nFilename = sql
12b00 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
12b10 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20  lename)+1;.     
12b20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61   int nFullPathna
12b30 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
12b40 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63  hname+1;.      c
12b50 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
12b60 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
12b70 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68  oc(MAX(nFullPath
12b80 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29  name,nFilename))
12b90 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
12ba0 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
12bb0 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
12bc0 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   )..      p->sha
12bd0 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
12be0 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
12bf0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
12c00 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
12c10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
12c20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
12c30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
12c40 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
12c50 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61    memcpy(zFullPa
12c60 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d  thname, zFilenam
12c70 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e, nFilename);. 
12c80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12c90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12ca0 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
12cb0 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  Vfs, zFilename,.
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ce0 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65     nFullPathname
12cf0 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
12d00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
12d10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
12d20 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
12d30 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
12d40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
12d50 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
12d60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
12d70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
12d80 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
12d90 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70  FE.      mutexOp
12da0 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  en = sqlite3Mute
12db0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
12dc0 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29  TEX_STATIC_OPEN)
12dd0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12de0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
12df0 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75  xOpen);.      mu
12e00 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
12e10 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
12e20 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
12e30 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
12e40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
12e50 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
12e60 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
12e70 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
12e80 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
12e90 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
12ea0 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
12eb0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
12ec0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
12ed0 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
12ee0 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
12ef0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
12f00 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
12f10 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
12f20 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
12f30 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
12f40 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65  erVfs(pBt->pPage
12f50 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20  r)==pVfs ){.    
12f60 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
12f70 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62           for(iDb
12f80 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e  =db->nDb-1; iDb>
12f90 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20  =0; iDb--){.    
12fa0 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70          Btree *p
12fb0 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61  Existing = db->a
12fc0 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
12fd0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
12fe0 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74  isting && pExist
12ff0 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b  ing->pBt==pBt ){
13000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
13010 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
13020 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
13030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
13040 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
13050 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
13060 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
13070 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
13080 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
13090 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
130a0 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
130b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
130c0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
130d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
130e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
130f0 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42       p->pBt = pB
13100 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74  t;.          pBt
13110 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
13120 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13130 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13140 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
13150 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
13160 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
13170 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
13180 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  hname);.    }.#i
13190 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
131a0 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
131b0 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f    /* In debug mo
131c0 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20  de, we mark all 
131d0 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
131e0 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65  ases as sharable
131f0 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  .      ** even w
13200 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74  hen they are not
13210 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65  .  This exercise
13220 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
13230 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  de and.      ** 
13240 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72  gives more oppor
13250 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72  tunity for asser
13260 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ts(sqlite3_mutex
13270 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a  _held()).      *
13280 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * statements to 
13290 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  find locking pro
132a0 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  blems..      */.
132b0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
132c0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 1;.    }.#en
132d0 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
132e0 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
132f0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
13300 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
13310 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
13320 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
13330 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
13340 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  re.    ** the ri
13350 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
13360 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
13370 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
13380 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20   that result.   
13390 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
133a0 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
133b0 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
133c0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
133d0 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
133e0 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
133f0 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
13400 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
13410 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
13420 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
13430 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
13440 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
13450 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
13460 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
13470 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
13480 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
13490 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
134a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
134b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
134c0 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
134d0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
134e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
134f0 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e  pen(pVfs, &pBt->
13500 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d  pPager, zFilenam
13510 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
13520 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54               EXT
13530 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20  RA_SIZE, flags, 
13540 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65  vfsFlags, pageRe
13550 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72  init);.    if( r
13560 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13570 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
13580 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70  erSetMmapLimit(p
13590 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e  Bt->pPager, db->
135a0 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72  szMmap);.      r
135b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
135c0 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70  ReadFileheader(p
135d0 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f  Bt->pPager,sizeo
135e0 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62  f(zDbHeader),zDb
135f0 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Header);.    }. 
13600 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13610 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
13620 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
13630 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  t;.    }.    pBt
13640 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75  ->openFlags = (u
13650 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74  8)flags;.    pBt
13660 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73  ->db = db;.    s
13670 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
13680 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syhandler(pBt->p
13690 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f  Pager, btreeInvo
136a0 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  keBusyHandler, p
136b0 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20  Bt);.    p->pBt 
136c0 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42  = pBt;.  .    pB
136d0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a  t->pCursor = 0;.
136e0 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
136f0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
13700 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
13710 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29  nly(pBt->pPager)
13720 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
13730 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
13740 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  Y;.#ifdef SQLITE
13750 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
13760 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
13770 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
13780 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20  ELETE;.#endif.  
13790 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
137a0 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20  : R-51873-39618 
137b0 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f  The page size fo
137c0 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  r a database fil
137d0 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  e is.    ** dete
137e0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d  rmined by the 2-
137f0 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63  byte integer loc
13800 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ated at an offse
13810 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72  t of 16 bytes fr
13820 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65  om.    ** the be
13830 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
13840 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
13850 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
13860 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b  ze = (zDbHeader[
13870 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65  16]<<8) | (zDbHe
13880 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20  ader[17]<<16);. 
13890 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65     if( pBt->page
138a0 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d  Size<512 || pBt-
138b0 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  >pageSize>SQLITE
138c0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20  _MAX_PAGE_SIZE. 
138d0 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74          || ((pBt
138e0 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42  ->pageSize-1)&pB
138f0 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20  t->pageSize)!=0 
13900 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ){.      pBt->pa
13910 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e  geSize = 0;.#ifn
13920 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13930 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
13940 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
13950 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
13960 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
13970 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
13980 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  se, then.      *
13990 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f  * leave the auto
139a0 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30  Vacuum mode at 0
139b0 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61   (do not auto-va
139c0 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20  cuum), even if. 
139d0 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44       ** SQLITE_D
139e0 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
139f0 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  M is true. On th
13a00 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
13a10 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
13a20 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
13a30 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
13a40 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
13a50 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20   is just a.     
13a60 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65   ** regular file
13a70 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63  -name. In this c
13a80 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ase the auto-vac
13a90 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70  uum applies as p
13aa0 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20  er normal..     
13ab0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46   */.      if( zF
13ac0 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
13ad0 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mdb ){.        p
13ae0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
13af0 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
13b00 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
13b10 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  : 0);.        pB
13b20 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
13b30 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
13b40 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20  AUTOVACUUM==2 ? 
13b50 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1 : 0);.      }.
13b60 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65  #endif.      nRe
13b70 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  serve = 0;.    }
13b80 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45  else{.      /* E
13b90 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
13ba0 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69  497-42412 The si
13bb0 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76  ze of the reserv
13bc0 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20  ed region is.   
13bd0 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
13be0 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65   by the one-byte
13bf0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
13c00 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66  r found at an of
13c10 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20  fset of 20.     
13c20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74   ** into the dat
13c30 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
13c40 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73  r. */.      nRes
13c50 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72  erve = zDbHeader
13c60 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [20];.      pBt-
13c70 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
13c80 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
13c90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13ca0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
13cb0 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
13cc0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
13cd0 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
13ce0 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
13cf0 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
13d00 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
13d10 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
13d20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
13d30 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  if.    }.    rc 
13d40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
13d50 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
13d60 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
13d70 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
13d80 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
13d90 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
13da0 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ut;.    pBt->usa
13db0 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
13dc0 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72  ageSize - nReser
13dd0 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
13de0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  (pBt->pageSize &
13df0 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d   7)==0 );  /* 8-
13e00 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  byte alignment o
13e10 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20  f pageSize */.  
13e20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
13e30 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
13e40 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
13e50 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13e60 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20  _DISKIO).    /* 
13e70 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68  Add the new BtSh
13e80 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74  ared object to t
13e90 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
13ea0 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64  harable BtShared
13eb0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
13ec0 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
13ed0 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
13ee0 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
13ef0 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
13f00 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65  ).      pBt->nRe
13f10 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54  f = 1;.      MUT
13f20 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53  EX_LOGIC( mutexS
13f30 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
13f40 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
13f50 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
13f60 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66  STER);).      if
13f70 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
13f80 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c  AFE && sqlite3Gl
13f90 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
13fa0 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
13fb0 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
13fc0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
13fd0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
13fe0 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
13ff0 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  pBt->mutex==0 ){
14000 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
14010 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14020 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c          db->mall
14030 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  ocFailed = 0;.  
14040 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
14050 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
14060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14070 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
14080 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
14090 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
140a0 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
140b0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
140c0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
140d0 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
140e0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
140f0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
14100 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
14110 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14120 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
14130 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
14140 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
14150 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
14160 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
14170 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
14180 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
14190 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
141a0 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
141b0 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
141c0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
141d0 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
141e0 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
141f0 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
14200 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
14210 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
14220 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
14230 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
14240 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
14250 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
14260 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
14270 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
14280 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
14290 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
142a0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
142b0 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
142c0 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
142d0 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
142e0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
142f0 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
14300 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
14310 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
14320 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29  >pBt<pSib->pBt )
14330 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
14340 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
14350 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
14360 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
14370 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
14380 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14390 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
143a0 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70  pSib->pNext && p
143b0 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
143c0 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
143d0 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
143e0 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
143f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14400 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
14410 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
14420 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
14430 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
14440 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
14450 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
14460 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
14470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14480 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
14490 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
144a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
144b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
144c0 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
144d0 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
144e0 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
144f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14500 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
14510 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
14520 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
14530 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
14540 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
14550 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
14560 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14570 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
14580 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
14590 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d      /* If the B-
145a0 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73  Tree was success
145b0 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65  fully opened, se
145c0 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
145d0 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20  e size to the.  
145e0 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c    ** default val
145f0 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e  ue. Except, when
14600 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65   opening on an e
14610 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70  xisting shared p
14620 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20  ager-cache,.    
14630 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65  ** do not change
14640 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
14650 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
14660 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
14670 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30  eeSchema(p, 0, 0
14680 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
14690 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
146a0 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70  hesize(p->pBt->p
146b0 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45  Pager, SQLITE_DE
146c0 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
146d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
146e0 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
146f0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
14700 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
14710 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
14720 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
14730 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
14740 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
14750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
14760 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
14770 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
14780 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
14790 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
147a0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
147b0 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
147c0 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
147d0 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
147e0 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
147f0 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
14800 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
14810 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
14820 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
14830 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
14840 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
14850 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
14860 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
14870 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
14880 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54  ARED_CACHE.  MUT
14890 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
148a0 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
148b0 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ; ).  BtShared *
148c0 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d  pList;.  int rem
148d0 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73  oved = 0;..  ass
148e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
148f0 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e  ex_notheld(pBt->
14900 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45  mutex) );.  MUTE
14910 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72  X_LOGIC( pMaster
14920 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
14930 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
14940 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
14950 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ; ).  sqlite3_mu
14960 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
14970 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d  r);.  pBt->nRef-
14980 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52  -;.  if( pBt->nR
14990 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef<=0 ){.    if(
149a0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
149b0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
149c0 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29  acheList)==pBt )
149d0 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  {.      GLOBAL(B
149e0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
149f0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
14a00 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
14a10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14a20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pList = GLOBAL(B
14a30 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
14a40 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
14a50 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41  ;.      while( A
14a60 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20  LWAYS(pList) && 
14a70 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42  pList->pNext!=pB
14a80 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  t ){.        pLi
14a90 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b  st=pList->pNext;
14aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
14ab0 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  f( ALWAYS(pList)
14ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
14ad0 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  t->pNext = pBt->
14ae0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
14af0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c     }.    if( SQL
14b00 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29  ITE_THREADSAFE )
14b10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
14b20 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e  mutex_free(pBt->
14b30 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20  mutex);.    }.  
14b40 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20    removed = 1;. 
14b50 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
14b60 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
14b70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f  );.  return remo
14b80 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  ved;.#else.  ret
14b90 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 1;.#endif.}.
14ba0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
14bb0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
14bc0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c  points to an all
14bd0 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d  ocation of .** M
14be0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
14bf0 20 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d   bytes with a 4-
14c00 62 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20  byte prefix for 
14c10 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20  a left-child.** 
14c20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
14c30 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65  ic void allocate
14c40 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
14c50 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
14c60 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20  !pBt->pTmpSpace 
14c70 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
14c80 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
14c90 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e  ageMalloc( pBt->
14ca0 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20  pageSize );..   
14cb0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75   /* One of the u
14cc0 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70  ses of pBt->pTmp
14cd0 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d  Space is to form
14ce0 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a  at cells before.
14cf0 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67      ** inserting
14d00 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61   them into a lea
14d10 66 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e  f page (function
14d20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20   fillInCell()). 
14d30 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c  If.    ** a cell
14d40 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20   is less than 4 
14d50 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69  bytes in size, i
14d60 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20  t is rounded up 
14d70 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a  to 4 bytes.    *
14d80 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73  * by the various
14d90 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d   routines that m
14da0 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79  anipulate binary
14db0 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20   cells. Which.  
14dc0 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68    ** can mean th
14dd0 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20  at fillInCell() 
14de0 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73  only initializes
14df0 20 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20   the first 2 or 
14e00 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f  3.    ** bytes o
14e10 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74  f pTmpSpace, but
14e20 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
14e30 34 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69  4 bytes are copi
14e40 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69  ed from.    ** i
14e50 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73  t into a databas
14e60 65 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20  e page. This is 
14e70 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70  not actually a p
14e80 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20  roblem, but it. 
14e90 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65     ** does cause
14ea0 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f   a valgrind erro
14eb0 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20  r when the 1 or 
14ec0 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69  2 bytes of uniti
14ed0 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64  alized .    ** d
14ee0 61 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f  ata is passed to
14ef0 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69   system call wri
14f00 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69  te(). So to avoi
14f10 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20  d this error,.  
14f20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69    ** zero the fi
14f30 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
14f40 65 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a  emp space here..
14f50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
14f60 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75  so:  Provide fou
14f70 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69  r bytes of initi
14f80 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66  alized space bef
14f90 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62  ore the.    ** b
14fa0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70  eginning of pTmp
14fb0 53 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61  Space as an area
14fc0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72   available to pr
14fd0 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  epend the.    **
14fe0 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e   left-child poin
14ff0 74 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ter to the begin
15000 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a  ning of a cell..
15010 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
15020 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
15030 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42  .      memset(pB
15040 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c  t->pTmpSpace, 0,
15050 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e   8);.      pBt->
15060 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a  pTmpSpace += 4;.
15070 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15080 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
15090 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
150a0 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
150b0 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
150c0 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
150d0 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54  ){.  if( pBt->pT
150e0 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
150f0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d  Bt->pTmpSpace -=
15100 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   4;.    sqlite3P
15110 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d  ageFree(pBt->pTm
15120 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74  pSpace);.    pBt
15130 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b  ->pTmpSpace = 0;
15140 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
15150 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61  ose an open data
15160 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64  base and invalid
15170 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e  ate all cursors.
15180 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15190 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20  treeClose(Btree 
151a0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
151b0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
151c0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
151d0 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
151e0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20   cursors opened 
151f0 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e  via this handle.
15200 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
15210 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15220 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
15230 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15240 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75  eEnter(p);.  pCu
15250 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  r = pBt->pCursor
15260 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20  ;.  while( pCur 
15270 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20  ){.    BtCursor 
15280 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20  *pTmp = pCur;.  
15290 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70    pCur = pCur->p
152a0 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54  Next;.    if( pT
152b0 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  mp->pBtree==p ){
152c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
152d0 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
152e0 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tmp);.    }.  }.
152f0 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  .  /* Rollback a
15300 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  ny active transa
15310 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74  ction and free t
15320 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74  he handle struct
15330 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61  ure..  ** The ca
15340 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
15350 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f  eeRollback() dro
15360 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63  ps any table-loc
15370 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20  ks held by.  ** 
15380 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a  this handle..  *
15390 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
153a0 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49  Rollback(p, SQLI
153b0 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c  TE_OK, 0);.  sql
153c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
153d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
153e0 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65  e are still othe
153f0 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  r outstanding re
15400 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
15410 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a  shared-btree.  *
15420 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74  * structure, ret
15430 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d  urn now. The rem
15440 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70  ainder of this p
15450 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
15460 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61  .  ** up the sha
15470 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a  red-btree..  */.
15480 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
15490 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d  tToLock==0 && p-
154a0 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20  >locked==0 );.  
154b0 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
154c0 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68   || removeFromSh
154d0 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29  aringList(pBt) )
154e0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74  {.    /* The pBt
154f0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e   is no longer on
15500 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
15510 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63  t, so we can acc
15520 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69  ess.    ** it wi
15530 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
15540 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a  hold the mutex..
15550 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c      **.    ** Cl
15560 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65  ean out and dele
15570 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  te the BtShared 
15580 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  object..    */. 
15590 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
155a0 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
155b0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
155c0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
155d0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72      if( pBt->xFr
155e0 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d  eeSchema && pBt-
155f0 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
15600 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65    pBt->xFreeSche
15610 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  ma(pBt->pSchema)
15620 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
15630 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74  te3DbFree(0, pBt
15640 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
15650 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
15660 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
15670 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  free(pBt);.  }..
15680 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15690 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
156a0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
156b0 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  ntToLock==0 );. 
156c0 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
156d0 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed==0 );.  if( p
156e0 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72  ->pPrev ) p->pPr
156f0 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
15700 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  Next;.  if( p->p
15710 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d  Next ) p->pNext-
15720 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
15730 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  v;.#endif..  sql
15740 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
15750 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15760 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
15770 65 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d  e the "soft" lim
15780 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
15790 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
157a0 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65   cache..** Unuse
157b0 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64  d and unmodified
157c0 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72   pages will be r
157d0 65 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65  ecycled when the
157e0 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
157f0 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
15800 20 65 78 63 65 65 64 73 20 74 68 69 73 20 73 6f   exceeds this so
15810 66 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74  ft limit.  But t
15820 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
15830 2a 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77  * cache is allow
15840 65 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65  ed to grow large
15850 72 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69  r than this limi
15860 74 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  t if it contains
15870 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73 20  .** dirty pages 
15880 6f 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69  or pages still i
15890 6e 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f  n active use..*/
158a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
158b0 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
158c0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
158d0 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
158e0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
158f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15900 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
15910 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
15920 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15930 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
15940 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
15950 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
15960 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
15970 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
15980 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15990 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
159a0 65 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69  e the "spill" li
159b0 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
159c0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
159d0 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74  e cache..** If t
159e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
159f0 65 73 20 65 78 63 65 65 64 73 20 74 68 69 73 20  es exceeds this 
15a00 6c 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77  limit during a w
15a10 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
15a20 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d  ,.** the pager m
15a30 69 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20  ight attempt to 
15a40 22 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f  "spill" pages to
15a50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72   the journal ear
15a60 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74  ly in.** order t
15a70 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79  o free up memory
15a80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
15a90 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
15aa0 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20  e current spill 
15ab0 73 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69  size.  If zero i
15ac0 73 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61  s passed.** as a
15ad0 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63  n argument, no c
15ae0 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
15af0 74 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a  to the spill siz
15b00 65 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a  e setting, so.**
15b10 20 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66   using mxPage of
15b20 20 30 20 69 73 20 61 20 77 61 79 20 74 6f 20 71   0 is a way to q
15b30 75 65 72 79 20 74 68 65 20 63 75 72 72 65 6e 74  uery the current
15b40 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a   spill size..*/.
15b50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15b60 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72  SetSpillSize(Btr
15b70 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
15b80 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
15b90 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
15ba0 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72  int res;.  asser
15bb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15bc0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
15bd0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
15be0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
15bf0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61   res = sqlite3Pa
15c00 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28  gerSetSpillsize(
15c10 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
15c20 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
15c30 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
15c40 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23  return res;.}..#
15c50 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
15c60 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20  AP_SIZE>0./*.** 
15c70 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74  Change the limit
15c80 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   on the amount o
15c90 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
15ca0 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a  ile that may be.
15cb0 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ** memory mapped
15cc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15cd0 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69  BtreeSetMmapLimi
15ce0 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69  t(Btree *p, sqli
15cf0 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70  te3_int64 szMmap
15d00 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
15d10 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
15d20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15d30 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
15d40 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
15d50 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15d60 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
15d70 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
15d80 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61  t->pPager, szMma
15d90 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
15da0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
15db0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15dc0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
15dd0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
15de0 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  >0 */../*.** Cha
15df0 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
15e00 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
15e10 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
15e20 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
15e30 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
15e40 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
15e50 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
15e60 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
15e70 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
15e80 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
15e90 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
15ea0 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
15eb0 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
15ec0 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
15ed0 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
15ee0 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
15ef0 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
15f00 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
15f10 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
15f20 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
15f30 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
15f40 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
15f50 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
15f60 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
15f70 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
15f80 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
15f90 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
15fa0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
15fb0 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
15fc0 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
15fd0 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46  e3BtreeSetPagerF
15fe0 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70  lags(.  Btree *p
15ff0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
16000 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73  * The btree to s
16010 65 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65  et the safety le
16020 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  vel on */.  unsi
16030 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20  gned pgFlags    
16040 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41     /* Various PA
16050 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29  GER_* flags */.)
16060 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
16070 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
16080 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16090 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
160a0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
160b0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
160c0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
160d0 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50  SetFlags(pBt->pP
160e0 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a  ager, pgFlags);.
160f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16100 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
16120 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
16130 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67  rn TRUE if the g
16140 69 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65  iven btree is se
16150 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65  t to safety leve
16160 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a  l 1.  In other.*
16170 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  * words, return 
16180 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28  TRUE if no sync(
16190 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20  ) occurs on the 
161a0 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  disk files..*/.i
161b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
161c0 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65  yncDisabled(Btre
161d0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
161e0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
161f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
16200 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16210 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
16220 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c  utex) );  .  sql
16230 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16240 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
16250 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
16260 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
16270 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74  3PagerNosync(pBt
16280 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c  ->pPager);.  sql
16290 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
162a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
162b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
162c0 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
162d0 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e  s size and the n
162e0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
162f0 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  d bytes per page
16300 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20  ..** Or, if the 
16310 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c  page size has al
16320 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64  ready been fixed
16330 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
16340 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74  READONLY .** wit
16350 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e  hout changing an
16360 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ything..**.** Th
16370 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74  e page size must
16380 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
16390 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
163a0 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20   65536.  If the 
163b0 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70  page.** size sup
163c0 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d  plied does not m
163d0 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61  eet this constra
163e0 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67  int then the pag
163f0 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a  e size is not.**
16400 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
16410 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63  Page sizes are c
16420 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65  onstrained to be
16430 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20   a power of two 
16440 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69  so that the regi
16450 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  on.** of the dat
16460 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20  abase file used 
16470 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67  for locking (beg
16480 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e  inning at PENDIN
16490 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66  G_BYTE,.** the f
164a0 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
164b0 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c  he 1GB boundary,
164c0 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65   0x40000000) nee
164d0 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61  ds to occur.** a
164e0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
164f0 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  of a page..**.**
16500 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52   If parameter nR
16510 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74  eserve is less t
16520 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
16530 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
16540 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70  erved.** bytes p
16550 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  er page is left 
16560 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
16570 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20   If the iFix!=0 
16580 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47  then the BTS_PAG
16590 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67  ESIZE_FIXED flag
165a0 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20   is set so that 
165b0 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a  the page size.**
165c0 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20   and autovacuum 
165d0 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  mode can no long
165e0 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  er be changed..*
165f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16600 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeSetPageSize(Bt
16610 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65  ree *p, int page
16620 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
16630 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20  ve, int iFix){. 
16640 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16650 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
16660 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16670 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
16680 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76  e>=-1 && nReserv
16690 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69  e<=255 );.  sqli
166a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
166b0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53  ;.#if SQLITE_HAS
166c0 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65  _CODEC.  if( nRe
166d0 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d  serve>pBt->optim
166e0 61 6c 52 65 73 65 72 76 65 20 29 20 70 42 74 2d  alReserve ) pBt-
166f0 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
16700 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a  = (u8)nReserve;.
16710 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
16720 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
16730 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
16740 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
16750 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
16760 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
16770 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
16780 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b  f( nReserve<0 ){
16790 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20  .    nReserve = 
167a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
167b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
167c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
167d0 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
167e0 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
167f0 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
16800 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
16810 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
16820 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
16830 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
16840 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
16850 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
16860 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
16870 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
16880 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
16890 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
168a0 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u32)pageSize;. 
168b0 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
168c0 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  (pBt);.  }.  rc 
168d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
168e0 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
168f0 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
16900 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
16910 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  ;.  pBt->usableS
16920 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
16930 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65  ize - (u16)nRese
16940 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20  rve;.  if( iFix 
16950 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
16960 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
16970 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  FIXED;.  sqlite3
16980 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16990 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
169a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
169b0 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
169c0 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
169d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
169e0 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
169f0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
16a00 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
16a10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
16a20 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
16a30 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ar to sqlite3Btr
16a40 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20  eeGetReserve(), 
16a50 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
16a60 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  * may only be ca
16a70 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75  lled if it is gu
16a80 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
16a90 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  e b-tree mutex i
16aa0 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c  s already.** hel
16ab0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
16ac0 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73   useful in one s
16ad0 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74  pecial case in t
16ae0 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f  he backup API co
16af0 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a  de where it is.*
16b00 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65  * known that the
16b10 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d   shared b-tree m
16b20 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75  utex is held, bu
16b30 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74  t the mutex on t
16b40 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
16b50 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
16b60 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74   *p is not. In t
16b70 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69  his case if sqli
16b80 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a  te3BtreeEnter().
16b90 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61  ** were to be ca
16ba0 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63  lled, it might c
16bb0 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65  ollide with some
16bc0 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e   other operation
16bd0 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
16be0 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
16bf0 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67  owns *p, causing
16c00 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76   undefined behav
16c10 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ior..*/.int sqli
16c20 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
16c30 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20  veNoMutex(Btree 
16c40 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
16c50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
16c60 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42  mutex_held(p->pB
16c70 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e  t->mutex) );.  n
16c80 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53   = p->pBt->pageS
16c90 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73  ize - p->pBt->us
16ca0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75  ableSize;.  retu
16cb0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn n;.}../*.** R
16cc0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
16cd0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
16ce0 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
16cf0 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
16d00 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61  .** are intentua
16d10 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e  lly left unused.
16d20 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72    This is the "r
16d30 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74  eserved" space t
16d40 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69  hat is.** someti
16d50 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65  mes used by exte
16d60 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  nsions..**.** If
16d70 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45   SQLITE_HAS_MUTE
16d80 58 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  X is defined the
16d90 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74  n the number ret
16da0 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20  urned is the.** 
16db0 67 72 65 61 74 65 72 20 6f 66 20 74 68 65 20 63  greater of the c
16dc0 75 72 72 65 6e 74 20 72 65 73 65 72 76 65 64 20  urrent reserved 
16dd0 73 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61  space and the ma
16de0 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a  ximum requested.
16df0 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61 63 65  ** reserve space
16e00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16e10 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52  BtreeGetOptimalR
16e20 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
16e30 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
16e40 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16e50 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
16e60 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
16e70 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65  oMutex(p);.#ifde
16e80 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
16e90 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42  EC.  if( n<p->pB
16ea0 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
16eb0 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e  e ) n = p->pBt->
16ec0 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a  optimalReserve;.
16ed0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
16ee0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16ef0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
16f00 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78  *.** Set the max
16f10 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
16f20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69  for a database i
16f30 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
16f40 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e  tive..** No chan
16f50 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20  ges are made if 
16f60 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e  mxPage is 0 or n
16f70 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61  egative..** Rega
16f80 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
16f90 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  lue of mxPage, r
16fa0 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
16fb0 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
16fc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16fd0 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74  eMaxPageCount(Bt
16fe0 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
16ff0 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ge){.  int n;.  
17000 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17010 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
17020 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
17030 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61  ount(p->pBt->pPa
17040 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
17050 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17060 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
17070 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
17080 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
17090 4c 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77  LETE flag if new
170a0 46 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20  Flag is 0 or 1. 
170b0 20 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d   If newFlag is -
170c0 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20  1,.** then make 
170d0 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77  no changes.  Alw
170e0 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76  ays return the v
170f0 61 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f  alue of the BTS_
17100 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a  SECURE_DELETE.**
17110 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74   setting after t
17120 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e  he change..*/.in
17130 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
17140 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
17150 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
17160 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
17170 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
17180 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
17190 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
171a0 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
171b0 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
171c0 61 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55  ags &= ~BTS_SECU
171d0 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69  RE_DELETE;.    i
171e0 66 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e  f( newFlag ) p->
171f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
17200 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
17210 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28  TE;.  } .  b = (
17220 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
17230 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
17240 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69  LETE)!=0;.  sqli
17250 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17260 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a  ;.  return b;.}.
17270 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
17280 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
17290 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
172a0 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65  database. If the
172b0 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a   'autoVacuum'.**
172c0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
172d0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74  n-zero, then aut
172e0 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73  o-vacuum mode is
172f0 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72   enabled. If zer
17300 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61  o, it.** is disa
17310 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c  bled. The defaul
17320 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  t value for the 
17330 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70  auto-vacuum prop
17340 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65  erty is .** dete
17350 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51  rmined by the SQ
17360 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
17370 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a  OVACUUM macro..*
17380 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17390 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeSetAutoVacuum(
173a0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75  Btree *p, int au
173b0 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65  toVacuum){.#ifde
173c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
173d0 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
173e0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
173f0 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61  Y;.#else.  BtSha
17400 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
17410 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
17420 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76  LITE_OK;.  u8 av
17430 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75   = (u8)autoVacuu
17440 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  m;..  sqlite3Btr
17450 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
17460 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
17470 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
17480 46 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76  FIXED)!=0 && (av
17490 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74   ?1:0)!=pBt->aut
174a0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
174b0 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
174c0 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
174d0 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
174e0 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20  m = av ?1:0;.   
174f0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
17500 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20   = av==2 ?1:0;. 
17510 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
17520 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
17530 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
17540 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
17550 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
17560 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
17570 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
17580 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
17590 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
175a0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
175b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
175c0 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
175d0 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
175e0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
175f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
17600 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
17610 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
17620 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
17630 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17640 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
17650 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
17660 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
17670 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
17680 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
17690 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
176a0 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
176b0 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
176c0 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
176d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
176e0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
176f0 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  c;.#endif.}.../*
17700 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65  .** Get a refere
17710 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66  nce to pPage1 of
17720 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17730 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a  le.  This will.*
17740 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61  * also acquire a
17750 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61   readlock on tha
17760 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  t file..**.** SQ
17770 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
17780 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
17790 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
177a0 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  not a.** well-fo
177b0 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
177c0 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  le, then SQLITE_
177d0 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
177e0 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned..** SQLITE_B
177f0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
17800 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
17810 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49  is locked.  SQLI
17820 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72  TE_NOMEM.** is r
17830 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75  eturned if we ru
17840 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
17850 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
17860 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72  lockBtree(BtShar
17870 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
17880 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
17890 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
178a0 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
178b0 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
178c0 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50  pPage1;     /* P
178d0 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
178e0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
178f0 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
17900 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17910 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
17920 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
17930 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20   nPageFile = 0; 
17940 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
17950 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
17960 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
17970 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20  nt nPageHeader; 
17980 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17990 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
179a0 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67  tabase according
179b0 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73   to hdr */..  as
179c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
179d0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
179e0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
179f0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
17a00 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
17a10 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  e3PagerSharedLoc
17a20 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
17a30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17a40 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
17a50 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  .  rc = btreeGet
17a60 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
17a70 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  age1, 0);.  if( 
17a80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
17a90 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
17aa0 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e   Do some checkin
17ab0 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65  g to help insure
17ac0 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65   the file we ope
17ad0 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20  ned really is.  
17ae0 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ** a valid datab
17af0 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a  ase file. .  */.
17b00 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48    nPage = nPageH
17b10 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65  eader = get4byte
17b20 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
17b30 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74  >aData);.  sqlit
17b40 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
17b50 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
17b60 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28  PageFile);.  if(
17b70 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d   nPage==0 || mem
17b80 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67  cmp(24+(u8*)pPag
17b90 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75  e1->aData, 92+(u
17ba0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
17bb0 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50  ,4)!=0 ){.    nP
17bc0 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b  age = nPageFile;
17bd0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65  .  }.  if( nPage
17be0 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61  >0 ){.    u32 pa
17bf0 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20  geSize;.    u32 
17c00 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
17c10 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67  u8 *page1 = pPag
17c20 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72  e1->aData;.    r
17c30 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
17c40 42 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  B;.    /* EVIDEN
17c50 43 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33  CE-OF: R-43737-3
17c60 39 39 39 39 20 45 76 65 72 79 20 76 61 6c 69 64  9999 Every valid
17c70 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
17c80 20 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20 20   file begins.   
17c90 20 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f 6c   ** with the fol
17ca0 6c 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73 20  lowing 16 bytes 
17cb0 28 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31 20  (in hex): 53 51 
17cc0 34 63 20 36 39 20 37 34 20 36 35 20 32 30 20 36  4c 69 74 65 20 6
17cd0 36 20 36 66 20 37 32 20 36 64 0a 20 20 20 20 2a  6 6f 72 6d.    *
17ce0 2a 20 36 31 20 37 34 20 32 30 20 33 33 20 30 30  * 61 74 20 33 00
17cf0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d  . */.    if( mem
17d00 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69  cmp(page1, zMagi
17d10 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20  cHeader, 16)!=0 
17d20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
17d30 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
17d40 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
17d50 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
17d60 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
17d70 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >1 ){.      pBt-
17d80 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
17d90 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20  _READ_ONLY;.    
17da0 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
17db0 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67  19]>1 ){.      g
17dc0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
17dd0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c  ailed;.    }.#el
17de0 73 65 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  se.    if( page1
17df0 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [18]>2 ){.      
17e00 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
17e10 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
17e20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
17e30 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20  ge1[19]>2 ){.   
17e40 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
17e50 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
17e60 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
17e70 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73  write version is
17e80 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20   set to 2, this 
17e90 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
17ea0 62 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20  be accessed.    
17eb0 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
17ec0 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f  If the log is no
17ed0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
17ee0 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65  open it now. The
17ef0 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  n .    ** return
17f00 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
17f10 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f  eturn without po
17f20 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65  pulating BtShare
17f30 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a  d.pPage1..    **
17f40 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65   The caller dete
17f50 63 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c  cts this and cal
17f60 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
17f70 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a   again. This is.
17f80 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20      ** required 
17f90 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f  as the version o
17fa0 66 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74  f page 1 current
17fb0 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20  ly in the page1 
17fc0 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61  buffer.    ** ma
17fd0 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74  y not be the lat
17fe0 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68  est version - th
17ff0 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77  ere may be a new
18000 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f  er one in the lo
18010 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20  g.    ** file.. 
18020 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61     */.    if( pa
18030 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70  ge1[19]==2 && (p
18040 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
18050 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b  TS_NO_WAL)==0 ){
18060 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65  .      int isOpe
18070 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  n = 0;.      rc 
18080 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
18090 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65  enWal(pBt->pPage
180a0 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20  r, &isOpen);.   
180b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
180c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
180d0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
180e0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65  failed;.      }e
180f0 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d  lse if( isOpen==
18100 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 ){.        rel
18110 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
18120 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
18130 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18140 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53    }.      rc = S
18150 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
18160 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
18170 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
18180 52 2d 31 35 34 36 35 2d 32 30 38 31 33 20 54 68  R-15465-20813 Th
18190 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69  e maximum and mi
181a0 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70  nimum embedded p
181b0 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72  ayload.    ** fr
181c0 61 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  actions and the 
181d0 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61  leaf payload fra
181e0 63 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73  ction values mus
181f0 74 20 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64  t be 64, 32, and
18200 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   32..    **.    
18210 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
18220 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74  design allowed t
18230 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20  hese amounts to 
18240 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a  vary, but as of.
18250 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
18260 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65  .6.0, we require
18270 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65   them to be fixe
18280 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
18290 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b  ( memcmp(&page1[
182a0 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30  21], "\100\040\0
182b0 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20  40",3)!=0 ){.   
182c0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
182d0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
182e0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
182f0 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36  -OF: R-51873-396
18300 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  18 The page size
18310 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
18320 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64  file is.    ** d
18330 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
18340 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20   2-byte integer 
18350 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66  located at an of
18360 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73  fset of 16 bytes
18370 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
18380 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
18390 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
183a0 20 2a 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65   */.    pageSize
183b0 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38   = (page1[16]<<8
183c0 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c  ) | (page1[17]<<
183d0 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  16);.    /* EVID
183e0 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38  ENCE-OF: R-25008
183f0 2d 32 31 36 38 38 20 54 68 65 20 73 69 7a 65 20  -21688 The size 
18400 6f 66 20 61 20 70 61 67 65 20 69 73 20 61 20 70  of a page is a p
18410 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20  ower of two.    
18420 2a 2a 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  ** between 512 a
18430 6e 64 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69  nd 65536 inclusi
18440 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  ve. */.    if( (
18450 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
18460 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c  eSize)!=0.     |
18470 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  | pageSize>SQLIT
18480 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
18490 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a  .     || pageSiz
184a0 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20  e<=256 .    ){. 
184b0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
184c0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
184d0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28   }.    assert( (
184e0 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
184f0 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
18500 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d  NCE-OF: R-59310-
18510 35 31 32 30 35 20 54 68 65 20 22 72 65 73 65 72  51205 The "reser
18520 76 65 64 20 73 70 61 63 65 22 20 73 69 7a 65 20  ved space" size 
18530 69 6e 20 74 68 65 20 31 2d 62 79 74 65 0a 20 20  in the 1-byte.  
18540 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 74 20    ** integer at 
18550 6f 66 66 73 65 74 20 32 30 20 69 73 20 74 68 65  offset 20 is the
18560 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
18570 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65   of space at the
18580 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65   end of.    ** e
18590 61 63 68 20 70 61 67 65 20 74 6f 20 72 65 73 65  ach page to rese
185a0 72 76 65 20 66 6f 72 20 65 78 74 65 6e 73 69 6f  rve for extensio
185b0 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ns. .    **.    
185c0 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
185d0 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68  R-37497-42412 Th
185e0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65  e size of the re
185f0 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73  served region is
18600 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  .    ** determin
18610 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
18620 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
18630 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
18640 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
18650 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74   ** into the dat
18660 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
18670 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65  r. */.    usable
18680 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20  Size = pageSize 
18690 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20  - page1[20];.   
186a0 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69   if( (u32)pageSi
186b0 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze!=pBt->pageSiz
186c0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66  e ){.      /* Af
186d0 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  ter reading the 
186e0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
186f0 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d  e database assum
18700 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a  ing a page size.
18710 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68        ** of BtSh
18720 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77  ared.pageSize, w
18730 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65  e have discovere
18740 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  d that the page-
18750 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  size is.      **
18760 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69   actually pageSi
18770 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  ze. Unlock the d
18780 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70  atabase, leave p
18790 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20  Bt->pPage1 at.  
187a0 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20      ** zero and 
187b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
187c0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
187d0 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  l call this func
187e0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67  tion.      ** ag
187f0 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72  ain with the cor
18800 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a  rect page-size..
18810 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
18820 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
18830 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75  1);.      pBt->u
18840 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
18850 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42  leSize;.      pB
18860 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
18870 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72  geSize;.      fr
18880 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
18890 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
188a0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
188b0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
188c0 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
188d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
188e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188f0 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73       pageSize-us
18900 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
18910 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18920 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e  }.    if( (pBt->
18930 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
18940 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29  TE_RecoveryMode)
18950 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61  ==0 && nPage>nPa
18960 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  geFile ){.      
18970 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
18980 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
18990 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
189a0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
189b0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
189c0 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20  : R-28312-64704 
189d0 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73 61  However, the usa
189e0 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  ble size is not 
189f0 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a  allowed to.    *
18a00 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34  * be less than 4
18a10 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  80. In other wor
18a20 64 73 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  ds, if the page 
18a30 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65  size is 512, the
18a40 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73  n the.    ** res
18a50 65 72 76 65 64 20 73 70 61 63 65 20 73 69 7a 65  erved space size
18a60 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33   cannot exceed 3
18a70 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73  2. */.    if( us
18a80 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a  ableSize<480 ){.
18a90 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18aa0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18ab0 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67    }.    pBt->pag
18ac0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
18ad0 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
18ae0 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
18af0 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ze;.#ifndef SQLI
18b00 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
18b10 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
18b20 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
18b30 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34  te(&page1[36 + 4
18b40 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70  *4])?1:0);.    p
18b50 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
18b60 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
18b70 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  1[36 + 7*4])?1:0
18b80 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
18b90 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20   /* maxLocal is 
18ba0 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
18bb0 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f  nt of payload to
18bc0 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66   store locally f
18bd0 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20  or.  ** a cell. 
18be0 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   Make sure it is
18bf0 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f   small enough so
18c00 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d   that at least m
18c10 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65  inFanout.  ** ce
18c20 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74  lls can will fit
18c30 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57   on one page.  W
18c40 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79  e assume a 10-by
18c50 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  te page header..
18c60 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65    ** Besides the
18c70 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65   payload, the ce
18c80 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20  ll must store:. 
18c90 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70   **     2-byte p
18ca0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
18cb0 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ll.  **     4-by
18cc0 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
18cd0 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65  .  **     9-byte
18ce0 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a   nKey value.  **
18cf0 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74       4-byte nDat
18d00 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  a value.  **    
18d10 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4-byte overflow
18d20 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20   page pointer.  
18d30 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e  ** So a cell con
18d40 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74  sists of a 2-byt
18d50 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61  e pointer, a hea
18d60 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20  der which is as 
18d70 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20  much as.  ** 17 
18d80 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f  bytes long, 0 to
18d90 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c   N bytes of payl
18da0 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69  oad, and an opti
18db0 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72  onal 4 byte over
18dc0 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70  flow.  ** page p
18dd0 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70  ointer..  */.  p
18de0 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28  Bt->maxLocal = (
18df0 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
18e00 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35  eSize-12)*64/255
18e10 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 23);.  pBt->m
18e20 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28  inLocal = (u16)(
18e30 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
18e40 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
18e50 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61  );.  pBt->maxLea
18e60 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  f = (u16)(pBt->u
18e70 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b  sableSize - 35);
18e80 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20  .  pBt->minLeaf 
18e90 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
18ea0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
18eb0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28  255 - 23);.  if(
18ec0 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31   pBt->maxLocal>1
18ed0 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  27 ){.    pBt->m
18ee0 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
18ef0 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   127;.  }else{. 
18f00 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65     pBt->max1byte
18f10 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42  Payload = (u8)pB
18f20 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d  t->maxLocal;.  }
18f30 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
18f40 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20  maxLeaf + 23 <= 
18f50 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
18f60 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  ) );.  pBt->pPag
18f70 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70  e1 = pPage1;.  p
18f80 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
18f90 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
18fa0 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e  TE_OK;..page1_in
18fb0 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c  it_failed:.  rel
18fc0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
18fd0 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
18fe0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
18ff0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
19000 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
19010 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
19020 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70  ursors open on p
19030 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20  Bt. This is for 
19040 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  use.** in assert
19050 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  () expressions, 
19060 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f  so it is only co
19070 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47  mpiled if NDEBUG
19080 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e   is not.** defin
19090 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77  ed..**.** Only w
190a0 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
190b0 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e   counted if wrOn
190c0 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49 66 20  ly is true.  If 
190d0 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c  wrOnly is.** fal
190e0 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73  se then all curs
190f0 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e  ors are counted.
19100 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
19110 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
19120 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f  routine, a curso
19130 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20  r is any cursor 
19140 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62  that.** is capab
19150 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72  le of reading or
19160 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
19170 64 61 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f  database.  Curso
19180 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20  rs that.** have 
19190 62 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74  been tripped int
191a0 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55  o the CURSOR_FAU
191b0 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74  LT state are not
191c0 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61   counted..*/.sta
191d0 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c  tic int countVal
191e0 69 64 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  idCursors(BtShar
191f0 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f  ed *pBt, int wrO
19200 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
19210 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20   *pCur;.  int r 
19220 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d  = 0;.  for(pCur=
19230 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43  pBt->pCursor; pC
19240 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70  ur; pCur=pCur->p
19250 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28  Next){.    if( (
19260 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43  wrOnly==0 || (pC
19270 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
19280 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d  TCF_WriteFlag)!=
19290 30 29 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d  0).     && pCur-
192a0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
192b0 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20  FAULT ) r++; .  
192c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
192d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
192e0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
192f0 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
19300 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74  s and we are not
19310 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a   in the middle.*
19320 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  * of a transacti
19330 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20  on but there is 
19340 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
19350 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  he database, the
19360 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
19370 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72  e unrefs the fir
19380 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
19390 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69  atabase file whi
193a0 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65  ch .** has the e
193b0 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69  ffect of releasi
193c0 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  ng the read lock
193d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
193e0 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
193f0 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74  n in progress, t
19400 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
19410 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
19420 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72  c void unlockBtr
19430 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61  eeIfUnused(BtSha
19440 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73  red *pBt){.  ass
19450 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
19460 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
19470 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
19480 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
19490 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20  rs(pBt,0)==0 || 
194a0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
194b0 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  on>TRANS_NONE );
194c0 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
194d0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
194e0 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50  _NONE && pBt->pP
194f0 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d  age1!=0 ){.    M
19500 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
19510 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
19520 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 31    assert( pPage1
19530 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
19540 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
19550 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
19560 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20  >pPager)==1 );. 
19570 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
19580 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   0;.    releaseP
19590 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65  ageNotNull(pPage
195a0 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
195b0 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74   If pBt points t
195c0 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20  o an empty file 
195d0 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61  then convert tha
195e0 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20  t empty file.** 
195f0 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79  into a new empty
19600 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69   database by ini
19610 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69  tializing the fi
19620 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  rst page of.** t
19630 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
19640 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61  static int newDa
19650 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20  tabase(BtShared 
19660 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
19670 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65   *pP1;.  unsigne
19680 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20  d char *data;.  
19690 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
196a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
196b0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
196c0 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
196d0 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72  nPage>0 ){.    r
196e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
196f0 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74  .  }.  pP1 = pBt
19700 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
19710 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
19720 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
19730 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
19740 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
19750 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
19760 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
19770 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
19780 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
19790 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
197a0 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
197b0 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
197c0 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74  er)==16 );.  dat
197d0 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42  a[16] = (u8)((pB
197e0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26  t->pageSize>>8)&
197f0 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37  0xff);.  data[17
19800 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
19810 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66  ageSize>>16)&0xf
19820 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d  f);.  data[18] =
19830 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d   1;.  data[19] =
19840 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   1;.  assert( pB
19850 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70  t->usableSize<=p
19860 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20  Bt->pageSize && 
19870 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b  pBt->usableSize+
19880 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69  255>=pBt->pageSi
19890 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20  ze);.  data[20] 
198a0 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65  = (u8)(pBt->page
198b0 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
198c0 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  leSize);.  data[
198d0 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61  21] = 64;.  data
198e0 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74  [22] = 32;.  dat
198f0 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65  a[23] = 32;.  me
19900 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20  mset(&data[24], 
19910 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65  0, 100-24);.  ze
19920 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f  roPage(pP1, PTF_
19930 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c  INTKEY|PTF_LEAF|
19940 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a  PTF_LEAFDATA );.
19950 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
19960 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
19970 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53  FIXED;.#ifndef S
19980 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
19990 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20  ACUUM.  assert( 
199a0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
199b0 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56  =1 || pBt->autoV
199c0 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73  acuum==0 );.  as
199d0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56  sert( pBt->incrV
199e0 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
199f0 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29  >incrVacuum==0 )
19a00 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
19a10 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42  ta[36 + 4*4], pB
19a20 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
19a30 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
19a40 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d  [36 + 7*4], pBt-
19a50 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65  >incrVacuum);.#e
19a60 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67  ndif.  pBt->nPag
19a70 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31  e = 1;.  data[31
19a80 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 1;.  return 
19a90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19aa0 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
19ab0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
19ac0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19ad0 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61 20 64  le (creating a d
19ae0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69  atabase.** consi
19af0 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c  sting of a singl
19b00 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63  e page and no sc
19b10 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52  hema objects). R
19b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
19b30 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ** if successful
19b40 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
19b50 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
19b60 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
19b70 74 65 33 42 74 72 65 65 4e 65 77 44 62 28 42 74  te3BtreeNewDb(Bt
19b80 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
19b90 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
19ba0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e  eEnter(p);.  p->
19bb0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
19bc0 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
19bd0 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71  se(p->pBt);.  sq
19be0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
19bf0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
19c00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
19c10 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77  t to start a new
19c20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
19c30 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
19c40 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20  n.** is started 
19c50 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
19c60 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72  gument is nonzer
19c70 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72  o, otherwise a r
19c80 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ead-.** transact
19c90 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63  ion.  If the sec
19ca0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
19cb0 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78  2 or more and ex
19cc0 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73  clusive.** trans
19cd0 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
19ce0 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  d, meaning that 
19cf0 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
19d00 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
19d10 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
19d20 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69  abase.  A preexi
19d30 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  sting transactio
19d40 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20  n may not be.** 
19d50 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c  upgraded to excl
19d60 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67  usive by calling
19d70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20   this routine a 
19d80 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68  second time - th
19d90 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79  e.** exclusivity
19da0 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73   flag only works
19db0 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73   for a new trans
19dc0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
19dd0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
19de0 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65  n must be starte
19df0 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
19e00 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e  ing any .** chan
19e10 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
19e20 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ase.  None of th
19e30 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
19e40 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f  ines .** will wo
19e50 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e  rk unless a tran
19e60 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
19e70 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20  ed first:.**.** 
19e80 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
19e90 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a  eCreateTable().*
19ea0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
19eb0 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29  reeCreateIndex()
19ec0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
19ed0 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
19ee0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
19ef0 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
19f00 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
19f10 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a  3BtreeInsert().*
19f20 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
19f30 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20  reeDelete().**  
19f40 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19f50 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a  UpdateMeta().**.
19f60 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c  ** If an initial
19f70 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75   attempt to acqu
19f80 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69  ire the lock fai
19f90 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f  ls because of lo
19fa0 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a  ck contention.**
19fb0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
19fc0 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
19fd0 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20   unlocked, then 
19fe0 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
19ff0 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68  handler.** if th
1a000 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74  ere is one.  But
1a010 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72   if there was pr
1a020 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d  eviously a read-
1a030 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20  lock, do not.** 
1a040 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
1a050 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72  handler - just r
1a060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
1a070 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y.  SQLITE_BUSY 
1a080 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
1a090 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c  when there is al
1a0a0 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
1a0b0 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  k in order to av
1a0c0 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a  oid a deadlock..
1a0d0 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  **.** Suppose th
1a0e0 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63  ere are two proc
1a0f0 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20  esses A and B.  
1a100 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  A has a read loc
1a110 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61  k and B has.** a
1a120 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20   reserved lock. 
1a130 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   B tries to prom
1a140 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ote to exclusive
1a150 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
1a160 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27  because.** of A'
1a170 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20  s read lock.  A 
1a180 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
1a190 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74   to reserved but
1a1a0 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42   is blocked by B
1a1b0 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20  ..** One or the 
1a1c0 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f  other of the two
1a1d0 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20   processes must 
1a1e0 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72  give way or ther
1a1f0 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70  e can be.** no p
1a200 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74  rogress.  By ret
1a210 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55  urning SQLITE_BU
1a220 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b  SY and not invok
1a230 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c  ing the busy cal
1a240 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20  lback.** when A 
1a250 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
1a260 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f  ad lock, we enco
1a270 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20  urage A to give 
1a280 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20  up and let B.** 
1a290 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20  proceed..*/.int 
1a2a0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
1a2b0 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c  nTrans(Btree *p,
1a2c0 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20   int wrflag){.  
1a2d0 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20  sqlite3 *pBlock 
1a2e0 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20  = 0;.  BtShared 
1a2f0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1a300 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a310 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  _OK;..  sqlite3B
1a320 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a330 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1a340 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1a350 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
1a360 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
1a370 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
1a380 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
1a390 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
1a3a0 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
1a3b0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
1a3c0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
1a3d0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
1a3e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
1a3f0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1a400 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
1a410 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
1a420 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
1a430 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1a440 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
1a450 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1a460 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1a470 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28   || IfNotOmitAV(
1a480 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1a490 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72  )==0 );..  /* Wr
1a4a0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
1a4b0 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c   are not possibl
1a4c0 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e on a read-only
1a4d0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
1a4e0 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
1a4f0 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1a500 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20  Y)!=0 && wrflag 
1a510 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1a520 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
1a530 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1a540 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  n;.  }..#ifndef 
1a550 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1a560 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66  ED_CACHE.  /* If
1a570 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73   another databas
1a580 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72  e handle has alr
1a590 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72  eady opened a wr
1a5a0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1a5b0 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68  .  ** on this sh
1a5c0 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
1a5d0 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
1a5e0 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
1a5f0 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75  ion is.  ** requ
1a600 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51  ested, return SQ
1a610 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a  LITE_LOCKED..  *
1a620 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67 20  /.  if( (wrflag 
1a630 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
1a640 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1a650 54 45 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e  TE).   || (pBt->
1a660 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
1a670 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a  ENDING)!=0.  ){.
1a680 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74      pBlock = pBt
1a690 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20  ->pWriter->db;. 
1a6a0 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61   }else if( wrfla
1a6b0 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  g>1 ){.    BtLoc
1a6c0 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f  k *pIter;.    fo
1a6d0 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
1a6e0 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
1a6f0 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
1a700 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
1a710 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
1a720 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
1a730 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  Iter->pBtree->db
1a740 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1a750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a760 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20   }.  if( pBlock 
1a770 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
1a780 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
1a790 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a  p->db, pBlock);.
1a7a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a7b0 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
1a7c0 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  HE;.    goto tra
1a7d0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65  ns_begun;.  }.#e
1a7e0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72  ndif..  /* Any r
1a7f0 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64  ead-only or read
1a800 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69  -write transacti
1a810 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61  on implies a rea
1a820 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20  d-lock on .  ** 
1a830 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f  page 1. So if so
1a840 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d  me other shared-
1a850 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72  cache client alr
1a860 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65  eady has a write
1a870 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70  -lock .  ** on p
1a880 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73  age 1, the trans
1a890 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  action cannot be
1a8a0 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63   opened. */.  rc
1a8b0 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
1a8c0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
1a8d0 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
1a8e0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53  D_LOCK);.  if( S
1a8f0 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67  QLITE_OK!=rc ) g
1a900 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1a910 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ..  pBt->btsFlag
1a920 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41  s &= ~BTS_INITIA
1a930 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28  LLY_EMPTY;.  if(
1a940 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29   pBt->nPage==0 )
1a950 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1a960 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  = BTS_INITIALLY_
1a970 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20  EMPTY;.  do {.  
1a980 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74    /* Call lockBt
1a990 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68  ree() until eith
1a9a0 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69  er pBt->pPage1 i
1a9b0 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20  s populated or. 
1a9c0 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28     ** lockBtree(
1a9d0 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68  ) returns someth
1a9e0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ing other than S
1a9f0 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74  QLITE_OK. lockBt
1aa00 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ree().    ** may
1aa10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1aa20 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d  K but leave pBt-
1aa30 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30  >pPage1 set to 0
1aa40 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a   if after.    **
1aa50 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20   reading page 1 
1aa60 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  it discovers tha
1aa70 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
1aa80 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1aa90 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  .    ** file is 
1aaa0 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  not pBt->pageSiz
1aab0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
1aac0 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c  lockBtree() will
1aad0 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70   update.    ** p
1aae0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20  Bt->pageSize to 
1aaf0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
1ab00 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
1ab10 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68  k..    */.    wh
1ab20 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
1ab30 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
1ab40 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65  ==(rc = lockBtre
1ab50 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20  e(pBt)) );..    
1ab60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ab70 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
1ab80 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62       if( (pBt->b
1ab90 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1aba0 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20  AD_ONLY)!=0 ){. 
1abb0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1abc0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
1abd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1abe0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1abf0 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  gerBegin(pBt->pP
1ac00 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71  ager,wrflag>1,sq
1ac10 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
1ac20 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  y(p->db));.     
1ac30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ac40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ac50 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
1ac60 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
1ac70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1ac80 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d  .  .    if( rc!=
1ac90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1aca0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1acb0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
1acc0 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63   }.  }while( (rc
1acd0 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42  &0xFF)==SQLITE_B
1ace0 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
1acf0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1ad00 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
1ad10 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75     btreeInvokeBu
1ad20 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29  syHandler(pBt) )
1ad30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
1ad40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1ad50 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1ad60 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
1ad70 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
1ad80 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53  ion++;.#ifndef S
1ad90 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1ada0 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66  D_CACHE.      if
1adb0 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
1adc0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1add0 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d   p->lock.pBtree=
1ade0 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54  =p && p->lock.iT
1adf0 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
1ae00 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b     p->lock.eLock
1ae10 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
1ae20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e        p->lock.pN
1ae30 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
1ae40 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70  ;.        pBt->p
1ae50 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b  Lock = &p->lock;
1ae60 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1ae70 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
1ae80 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
1ae90 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
1aea0 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
1aeb0 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
1aec0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
1aed0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
1aee0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
1aef0 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  nTrans;.    }.  
1af00 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
1af10 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1af20 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
1af30 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge1;.#ifndef SQL
1af40 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1af50 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65  CACHE.      asse
1af60 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65  rt( !pBt->pWrite
1af70 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r );.      pBt->
1af80 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20  pWriter = p;.   
1af90 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
1afa0 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49   &= ~BTS_EXCLUSI
1afb0 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72  VE;.      if( wr
1afc0 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74  flag>1 ) pBt->bt
1afd0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58  sFlags |= BTS_EX
1afe0 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a  CLUSIVE;.#endif.
1aff0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
1b000 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20   db-size header 
1b010 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65  field is incorre
1b020 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ct (as it may be
1b030 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20   if an old.     
1b040 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62   ** client has b
1b050 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  een writing the 
1b060 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
1b070 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44  update it now. D
1b080 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  oing.      ** th
1b090 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  is sooner rather
1b0a0 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e   than later mean
1b0b0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  s the database s
1b0c0 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a  ize can safely .
1b0d0 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64        ** re-read
1b0e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1b0f0 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69  ze from page 1 i
1b100 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72  f a savepoint or
1b110 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
1b120 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f     ** rollback o
1b130 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
1b140 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
1b150 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1b160 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74   pBt->nPage!=get
1b170 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1b180 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20  Data[28]) ){.   
1b190 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b1a0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
1b1b0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1b1c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b1d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b1e0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1b1f0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1b200 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
1b210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b220 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61  .    }.  }...tra
1b230 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20  ns_begun:.  if( 
1b240 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1b250 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f   wrflag ){.    /
1b260 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65  * This call make
1b270 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  s sure that the 
1b280 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f  pager has the co
1b290 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a  rrect number of.
1b2a0 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65      ** open save
1b2b0 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73  points. If the s
1b2c0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
1b2d0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1b2e0 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65  0 and.    ** the
1b2f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
1b300 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
1b310 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62  , then it will b
1b320 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20  e opened here.. 
1b330 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
1b340 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
1b350 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1b360 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61  ager, p->db->nSa
1b370 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20  vepoint);.  }.. 
1b380 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1b390 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
1b3a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1b3b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
1b3c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b3d0 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
1b3e0 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
1b3f0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
1b400 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
1b410 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
1b420 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
1b430 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
1b440 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
1b450 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
1b460 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
1b470 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1b480 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
1b490 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
1b4a0 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
1b4b0 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
1b4c0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
1b4d0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4f0 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
1b500 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
1b510 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1b520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b530 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
1b540 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
1b550 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b570 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1b580 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
1b590 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
1b5a0 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74  pBt;.  u8 isInit
1b5b0 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
1b5c0 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Init;.  Pgno pgn
1b5d0 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
1b5e0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1b5f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1b600 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
1b610 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  ) );.  rc = btre
1b620 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
1b630 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1b640 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
1b650 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
1b660 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e  aps_out;.  }.  n
1b670 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
1b680 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ell;..  for(i=0;
1b690 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1b6a0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1b6b0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1b6c0 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50  i);..    ptrmapP
1b6d0 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
1b6e0 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20   pCell, &rc);.. 
1b6f0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
1b700 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
1b710 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
1b720 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
1b730 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1b740 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
1b750 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
1b760 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
1b770 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
1b780 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
1b790 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
1b7a0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1b7b0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1b7c0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1b7d0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
1b7e0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
1b7f0 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
1b800 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69  c);.  }..set_chi
1b810 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a  ld_ptrmaps_out:.
1b820 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
1b830 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
1b840 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b850 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e  .** Somewhere on
1b860 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e   pPage is a poin
1b870 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
1b880 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20  m.  Modify this 
1b890 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68  pointer so.** th
1b8a0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
1b8b0 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
1b8c0 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
1b8d0 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
1b8e0 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69  er to.** be modi
1b8f0 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77  fied, as  follow
1b900 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
1b910 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
1b920 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
1b930 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
1b940 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
1b950 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1b960 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
1b970 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
1b980 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
1b990 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
1b9a0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1b9b0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
1b9c0 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
1b9d0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
1b9e0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
1b9f0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
1ba00 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
1ba10 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
1ba20 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
1ba30 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
1ba40 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
1ba50 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1ba80 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
1ba90 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
1baa0 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
1bab0 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
1bac0 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
1bad0 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73   u8 eType){.  as
1bae0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1baf0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
1bb00 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1bb10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1bb20 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
1bb30 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
1bb40 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d   );.  if( eType=
1bb50 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1bb60 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
1bb70 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
1bb80 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
1bb90 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
1bba0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
1bbb0 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
1bbc0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
1bbd0 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
1bbe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1bbf0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1bc00 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
1bc10 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
1bc20 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
1bc30 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
1bc40 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
1bc50 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
1bc60 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e  nt nCell;.    in
1bc70 74 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20  t rc;..    rc = 
1bc80 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
1bc90 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1bca0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1bcb0 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
1bcc0 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72  >nCell;..    for
1bcd0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
1bce0 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ++){.      u8 *p
1bcf0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1bd00 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
1bd10 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1bd20 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a  AP_OVERFLOW1 ){.
1bd30 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
1bd40 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70   info;.        p
1bd50 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
1bd60 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
1bd70 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  info);.        i
1bd80 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
1bd90 77 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 43  w.         && pC
1bda0 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell+info.iOverfl
1bdb0 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44 61  ow+3<=pPage->aDa
1bdc0 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
1bdd0 67 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69  ge.         && i
1bde0 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26  From==get4byte(&
1bdf0 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
1be00 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20 29  flow]).        )
1be10 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1be20 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
1be30 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f  .iOverflow], iTo
1be40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
1be50 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1be60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1be70 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
1be80 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b  pCell)==iFrom ){
1be90 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1bea0 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b  yte(pCell, iTo);
1beb0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1bec0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bed0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1bee0 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b   if( i==nCell ){
1bef0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1bf00 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  !=PTRMAP_BTREE |
1bf10 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  | .          get
1bf20 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1bf30 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1bf40 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20  fset+8])!=iFrom 
1bf50 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1bf60 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1bf70 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
1bf80 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1bf90 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1bfa0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
1bfb0 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   iTo);.    }..  
1bfc0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
1bfd0 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
1bfe0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1bff0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
1c000 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
1c010 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1c020 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
1c030 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
1c040 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
1c050 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
1c060 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
1c070 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  id..**.** The is
1c080 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69  Commit flag indi
1c090 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65  cates that there
1c0a0 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
1c0b0 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20  emember that.** 
1c0c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
1c0d0 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
1c0e0 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
1c0f0 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70   page pDbPage->p
1c100 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77  gno .** can be w
1c110 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
1c120 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1c130 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
1c140 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a  o write to that.
1c150 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ** page..*/.stat
1c160 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
1c170 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1c180 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
1c190 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
1c1a0 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
1c1b0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
1c1c0 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
1c1d0 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
1c1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1c1f0 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
1c200 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1c210 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
1c220 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1c230 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1c240 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
1c250 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
1c260 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
1c270 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c280 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
1c290 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
1c2a0 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
1c2b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43            /* isC
1c2c0 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65  ommit flag passe
1c2d0 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  d to sqlite3Page
1c2e0 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a  rMovepage */.){.
1c2f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
1c300 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
1c310 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
1c320 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
1c330 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1c340 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
1c350 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
1c360 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
1c370 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1c380 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
1c390 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1c3a0 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
1c3b0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
1c3c0 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
1c3d0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1c3e0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1c3f0 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
1c400 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1c410 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1c420 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1c430 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
1c440 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  Bt );..  /* Move
1c450 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
1c460 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c  om its current l
1c470 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
1c480 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
1c490 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
1c4a0 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
1c4b0 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
1c4c0 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
1c4d0 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
1c4e0 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
1c4f0 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
1c500 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
1c510 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
1c520 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
1c530 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
1c540 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43  , iFreePage, isC
1c550 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
1c560 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1c570 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c580 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
1c590 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
1c5a0 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
1c5b0 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
1c5c0 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
1c5d0 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
1c5e0 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
1c5f0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
1c600 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
1c610 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
1c620 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
1c630 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
1c640 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
1c650 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
1c660 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
1c670 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
1c680 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
1c690 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
1c6a0 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
1c6b0 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
1c6c0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
1c6d0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
1c6e0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
1c6f0 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
1c700 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
1c710 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
1c720 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1c730 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1c740 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
1c750 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1c760 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
1c770 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
1c780 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
1c790 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c7a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c7b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1c7c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
1c7d0 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
1c7e0 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
1c7f0 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
1c800 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
1c810 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1c820 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
1c830 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
1c840 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b  iFreePage, &rc);
1c850 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1c860 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c870 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c880 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c890 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
1c8a0 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
1c8b0 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
1c8c0 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
1c8d0 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
1c8e0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1c8f0 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
1c900 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
1c910 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
1c920 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
1c930 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
1c940 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
1c950 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  E ){.    rc = bt
1c960 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1c970 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
1c980 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
1c990 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c9a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1c9b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1c9c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1c9d0 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
1c9e0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1c9f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ca00 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1ca10 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
1ca20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ca30 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
1ca40 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
1ca50 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
1ca60 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
1ca70 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
1ca80 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
1ca90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1caa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1cab0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
1cac0 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
1cad0 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b   iPtrPage, &rc);
1cae0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1caf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
1cb00 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1cb10 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
1cb20 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
1cb30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
1cb40 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1cb50 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
1cb60 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
1cb70 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
1cb80 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
1cb90 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
1cba0 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
1cbb0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
1cbc0 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
1cbd0 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
1cbe0 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
1cbf0 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
1cc00 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63  o point in .** c
1cc10 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1cc20 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
1cc30 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
1cc40 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72   Or, if an error
1cc50 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74   .** occurs, ret
1cc60 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  urn some other e
1cc70 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
1cc80 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c   More specifical
1cc90 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
1cca0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
1ccb0 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61  -organize the da
1ccc0 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68  tabase so .** th
1ccd0 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
1cce0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
1ccf0 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73  rently in use is
1cd00 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73   no longer in us
1cd10 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  e..**.** Paramet
1cd20 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e  er nFin is the n
1cd30 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1cd40 68 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73  hat this databas
1cd50 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a  e would contain.
1cd60 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e  ** were this fun
1cd70 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74  ction called unt
1cd80 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  il it returns SQ
1cd90 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
1cda0 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20   If the bCommit 
1cdb0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
1cdc0 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63  -zero, this func
1cdd0 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
1cde0 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  t the .** caller
1cdf0 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
1ce00 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
1ce10 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74  p() until it ret
1ce20 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1ce30 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72   .** or an error
1ce40 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73  . bCommit is pas
1ce50 73 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20  sed true for an 
1ce60 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63  auto-vacuum-on-c
1ce70 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74  ommit .** operat
1ce80 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f  ion, or false fo
1ce90 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  r an incremental
1cea0 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74   vacuum..*/.stat
1ceb0 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
1cec0 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
1ced0 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20  pBt, Pgno nFin, 
1cee0 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e  Pgno iLastPg, in
1cef0 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67  t bCommit){.  Pg
1cf00 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20  no nFreeList;   
1cf10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1cf20 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c  r of pages still
1cf30 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
1cf40 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t */.  int rc;..
1cf50 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1cf60 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1cf70 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1cf80 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46  sert( iLastPg>nF
1cf90 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54  in );..  if( !PT
1cfa0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1cfb0 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
1cfc0 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
1cfd0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1cfe0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
1cff0 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
1d000 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
1d010 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1d020 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1d030 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
1d040 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eeList==0 ){.   
1d050 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d060 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
1d070 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1d080 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
1d090 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
1d0a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1d0b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d0c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d0d0 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
1d0e0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1d0f0 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
1d100 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1d110 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
1d120 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1d130 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
1d140 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
1d150 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1d160 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
1d170 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ge from the file
1d180 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  s free-list. Thi
1d190 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
1d1a0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  d.        ** if 
1d1b0 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a  bCommit is non-z
1d1c0 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
1d1d0 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
1d1e0 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
1d1f0 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
1d200 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
1d210 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1d220 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
1d230 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
1d240 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
1d250 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
1d260 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
1d270 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1d280 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
1d290 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
1d2a0 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
1d2b0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
1d2c0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
1d2d0 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
1d2e0 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c  , iLastPg, BTALL
1d2f0 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20  OC_EXACT);.     
1d300 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d310 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d320 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1d340 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
1d350 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1d360 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1d370 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1d380 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
1d390 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1d3a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1d3b0 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
1d3c0 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
1d3d0 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
1d3e0 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
1d3f0 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65  ;.      u8 eMode
1d400 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20   = BTALLOC_ANY; 
1d410 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65    /* Mode parame
1d420 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
1d430 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20  BtreePage() */. 
1d440 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20       Pgno iNear 
1d450 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1d460 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74  * nearby paramet
1d470 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1d480 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20  treePage() */.. 
1d490 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
1d4a0 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
1d4b0 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30  tPg, &pLastPg, 0
1d4c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1d4d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d4e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d4f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1d500 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73  /* If bCommit is
1d510 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
1d520 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
1d530 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
1d540 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
1d550 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
1d560 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
1d570 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
1d580 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
1d590 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
1d5a0 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
1d5b0 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72  if bCommit is gr
1d5c0 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
1d5d0 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
1d5e0 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
1d5f0 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
1d600 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
1d610 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
1d620 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
1d630 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
1d640 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1d650 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1d660 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20  {.        eMode 
1d670 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20  = BTALLOC_LE;.  
1d680 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46        iNear = nF
1d690 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  in;.      }.    
1d6a0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
1d6b0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1d6c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1d6d0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1d6e0 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1d6f0 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20  iFreePg, iNear, 
1d700 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  eMode);.        
1d710 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d720 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1d730 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
1d740 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  Pg);.          r
1d750 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1d760 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65    }.        rele
1d770 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
1d780 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
1d790 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65  bCommit && iFree
1d7a0 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20  Pg>nFin );.     
1d7b0 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
1d7c0 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  <iLastPg );.    
1d7d0 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65    .      rc = re
1d7e0 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
1d7f0 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
1d800 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
1d810 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20  g, bCommit);.   
1d820 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1d830 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69  LastPg);.      i
1d840 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d850 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1d860 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1d870 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1d880 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1d890 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61    do {.      iLa
1d8a0 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69  stPg--;.    }whi
1d8b0 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
1d8c0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1d8d0 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53  Bt) || PTRMAP_IS
1d8e0 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
1d8f0 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62  g) );.    pBt->b
1d900 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
1d910 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1d920 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
1d930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  ;.}../*.** The d
1d950 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
1d960 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  y the first argu
1d970 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d  ment is an auto-
1d980 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a  vacuum database.
1d990 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69  ** nOrig pages i
1d9a0 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
1d9b0 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67  g nFree free pag
1d9c0 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65  es. Return the e
1d9d0 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65  xpected .** size
1d9e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d9f0 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77   in pages follow
1da00 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ing an auto-vacu
1da10 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  um operation..*/
1da20 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e  .static Pgno fin
1da30 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65  alDbSize(BtShare
1da40 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72  d *pBt, Pgno nOr
1da50 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b  ig, Pgno nFree){
1da60 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20  .  int nEntry;  
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da80 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1da90 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70  entries on one p
1daa0 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  trmap page */.  
1dab0 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20  Pgno nPtrmap;   
1dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dad0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72  /* Number of Ptr
1dae0 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20  Map pages to be 
1daf0 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  freed */.  Pgno 
1db00 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nFin;           
1db10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1db20 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
1db30 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
1db40 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e  sableSize/5;.  n
1db50 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d  Ptrmap = (nFree-
1db60 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47  nOrig+PTRMAP_PAG
1db70 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b  ENO(pBt, nOrig)+
1db80 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a  nEntry)/nEntry;.
1db90 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
1dba0 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
1dbb0 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45  ;.  if( nOrig>PE
1dbc0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1dbd0 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
1dbe0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1dbf0 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
1dc00 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  -;.  }.  while( 
1dc10 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1dc20 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
1dc30 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1dc40 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1dc50 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72  nFin--;.  }..  r
1dc60 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f  eturn nFin;.}../
1dc70 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
1dc80 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
1dc90 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63   opened before c
1dca0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
1dcb0 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66  tion..** It perf
1dcc0 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e  orms a single un
1dcd0 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72  it of work towar
1dce0 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ds an incrementa
1dcf0 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20  l vacuum..**.** 
1dd00 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  If the increment
1dd10 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e  al vacuum is fin
1dd20 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73  ished after this
1dd30 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75   function has ru
1dd40 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  n,.** SQLITE_DON
1dd50 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  E is returned. I
1dd60 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69  f it is not fini
1dd70 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72  shed, but no err
1dd80 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20  or occurred,.** 
1dd90 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1dda0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1ddb0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1ddc0 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73   code. .*/.int s
1ddd0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56  qlite3BtreeIncrV
1dde0 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
1ddf0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1de00 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1de10 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
1de20 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1de30 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1de40 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1de50 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e  S_WRITE && p->in
1de60 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1de70 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74  TE );.  if( !pBt
1de80 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
1de90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1dea0 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DONE;.  }else{. 
1deb0 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20     Pgno nOrig = 
1dec0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1ded0 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  Bt);.    Pgno nF
1dee0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
1def0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1df00 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e  ta[36]);.    Pgn
1df10 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62  o nFin = finalDb
1df20 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c  Size(pBt, nOrig,
1df30 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66   nFree);..    if
1df40 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a  ( nOrig<nFin ){.
1df50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1df60 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1df70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46      }else if( nF
1df80 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
1df90 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
1dfa0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1dfb0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1dfc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1dfd0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
1dfe0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
1dff0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1e000 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
1e010 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c  Bt, nFin, nOrig,
1e020 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
1e030 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e040 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e050 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e060 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
1e070 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1e080 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1e090 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1e0a0 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
1e0b0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
1e0c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1e0d0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1e0e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1e0f0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1e100 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1e110 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1e120 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
1e130 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
1e140 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
1e150 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
1e160 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f   is committed fo
1e170 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
1e180 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
1e190 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
1e1a0 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20   returned, then 
1e1b0 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20  *pnTrunc is set 
1e1c0 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
1e1d0 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61   pages.** the da
1e1e0 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
1e1f0 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  ld be truncated 
1e200 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  to during the co
1e210 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a  mmit process. .*
1e220 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62  * i.e. the datab
1e230 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f  ase has been reo
1e240 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74  rganized so that
1e250 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   only the first 
1e260 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65  *pnTrunc.** page
1e270 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f  s are in use..*/
1e280 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f  .static int auto
1e290 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53  VacuumCommit(BtS
1e2a0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
1e2b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e2c0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
1e2d0 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
1e2e0 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e  ;.  VVA_ONLY( in
1e2f0 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33  t nRef = sqlite3
1e300 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
1e310 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65  ager); )..  asse
1e320 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1e330 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1e340 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61  x) );.  invalida
1e350 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
1e360 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72  he(pBt);.  asser
1e370 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  t(pBt->autoVacuu
1e380 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  m);.  if( !pBt->
1e390 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20  incrVacuum ){.  
1e3a0 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1e3b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e3c0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
1e3d0 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61  ase after autova
1e3e0 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50  cuuming */.    P
1e3f0 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20  gno nFree;      
1e400 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1e410 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
1e420 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a  list initially *
1e430 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65  /.    Pgno iFree
1e440 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
1e450 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20  next page to be 
1e460 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e  freed */.    Pgn
1e470 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
1e480 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1e490 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20   before freeing 
1e4a0 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20  */..    nOrig = 
1e4b0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1e4c0 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52  Bt);.    if( PTR
1e4d0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1e4e0 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d  nOrig) || nOrig=
1e4f0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1e500 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
1e510 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
1e520 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65  ssible to create
1e530 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20   a database for 
1e540 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20  which the final 
1e550 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
1e560 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65   either a pointe
1e570 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68  r-map page or th
1e580 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70  e pending-byte p
1e590 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20  age. If one.    
1e5a0 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65    ** is encounte
1e5b0 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61  red, this indica
1e5c0 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  tes corruption..
1e5d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
1e5e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1e5f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1e600 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  ..    nFree = ge
1e610 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1e620 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1e630 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61  .    nFin = fina
1e640 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
1e650 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20  ig, nFree);.    
1e660 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29  if( nFin>nOrig )
1e670 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1e680 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1e690 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20   if( nFin<nOrig 
1e6a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
1e6b0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1e6c0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
1e6d0 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72     for(iFree=nOr
1e6e0 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26  ig; iFree>nFin &
1e6f0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1e700 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20   iFree--){.     
1e710 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
1e720 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
1e730 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d  iFree, 1);.    }
1e740 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
1e750 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
1e760 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
1e770 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
1e780 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e790 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
1e7a0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
1e7b0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1e7c0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1e7d0 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
1e7e0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1e7f0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1e800 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1e810 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1e820 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46  1->aData[28], nF
1e830 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  in);.      pBt->
1e840 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
1e850 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1e860 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a  e = nFin;.    }.
1e870 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1e890 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1e8a0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1e8b0 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1e8c0 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50  ( nRef>=sqlite3P
1e8d0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1e8e0 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
1e8f0 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a   rc;.}..#else /*
1e900 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f   ifndef SQLITE_O
1e910 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
1e920 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68  /.# define setCh
1e930 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51  ildPtrmaps(x) SQ
1e940 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
1e950 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1e960 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
1e970 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f  t phase of a two
1e980 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
1e990 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1e9a0 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63  causes a rollbac
1e9b0 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  k journal to be 
1e9c0 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64  created (if it d
1e9d0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
1e9e0 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f  exist).** and po
1e9f0 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f  pulated with eno
1ea00 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ugh information 
1ea10 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  so that if a pow
1ea20 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a  er loss occurs.*
1ea30 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  * the database c
1ea40 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  an be restored t
1ea50 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1ea60 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20  tate by playing 
1ea70 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  back.** the jour
1ea80 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63  nal.  Then the c
1ea90 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a  ontents of the j
1eaa0 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68  ournal are flush
1eab0 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65  ed out to.** the
1eac0 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68   disk.  After th
1ead0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66  e journal is saf
1eae0 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68  ely on oxide, th
1eaf0 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  e changes to the
1eb00 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65  .** database are
1eb10 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1eb20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1eb30 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f  and flushed to o
1eb40 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20  xide..** At the 
1eb50 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c  end of this call
1eb60 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  , the rollback j
1eb70 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69  ournal still exi
1eb80 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69  sts on the.** di
1eb90 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74  sk and we are st
1eba0 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20  ill holding all 
1ebb0 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72  locks, so the tr
1ebc0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f  ansaction has no
1ebd0 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20  t.** committed. 
1ebe0 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65   See sqlite3Btre
1ebf0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1ec00 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
1ec10 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
1ec20 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
1ec30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
1ec40 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
1ec50 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
1ec60 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
1ec70 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
1ec80 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1ec90 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
1eca0 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
1ecb0 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
1ecc0 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
1ecd0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
1ece0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1ecf0 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
1ed00 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1ed10 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
1ed20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
1ed30 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
1ed40 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
1ed50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
1ed60 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
1ed70 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
1ed80 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
1ed90 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
1eda0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
1edb0 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
1edc0 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
1edd0 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
1ede0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
1edf0 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
1ee00 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1ee10 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
1ee20 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
1ee30 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
1ee40 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
1ee50 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
1ee60 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
1ee70 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
1ee80 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
1ee90 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
1eea0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1eeb0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1eec0 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
1eed0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
1eee0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1eef0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
1ef00 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1ef10 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
1ef20 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1ef30 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
1ef40 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
1ef50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ef60 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1ef70 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1ef80 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63  cuum ){.      rc
1ef90 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d   = autoVacuumCom
1efa0 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20  mit(pBt);.      
1efb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1efc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
1efd0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1efe0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1eff0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1f000 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d    }.    if( pBt-
1f010 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a  >bDoTruncate ){.
1f020 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1f030 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
1f040 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74  pBt->pPager, pBt
1f050 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  ->nPage);.    }.
1f060 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
1f070 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1f080 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e  itPhaseOne(pBt->
1f090 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c  pPager, zMaster,
1f0a0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1f0b0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1f0c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1f0d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1f0e0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1f0f0 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65   from both Btree
1f100 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1f110 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61   and BtreeRollba
1f120 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63  ck().** at the c
1f130 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74  onclusion of a t
1f140 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
1f150 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
1f160 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42  EndTransaction(B
1f170 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
1f180 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1f190 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Bt;.  sqlite3 *d
1f1a0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
1f1b0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1f1c0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1f1d0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1f1e0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1f1f0 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e  M.  pBt->bDoTrun
1f200 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  cate = 0;.#endif
1f210 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1f220 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  s>TRANS_NONE && 
1f230 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20  db->nVdbeRead>1 
1f240 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
1f250 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74  re are other act
1f260 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ive statements t
1f270 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68  hat belong to th
1f280 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  is database.    
1f290 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67  ** handle, downg
1f2a0 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f  rade to a read-o
1f2b0 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  nly transaction.
1f2c0 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65   The other state
1f2d0 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79  ments.    ** may
1f2e0 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
1f2f0 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
1f300 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77  ase.  */.    dow
1f310 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
1f320 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
1f330 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  );.    p->inTran
1f340 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  s = TRANS_READ;.
1f350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1f360 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
1f370 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  d any kind of tr
1f380 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
1f390 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  decrement the . 
1f3a0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1f3b0 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  n count of the s
1f3c0 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
1f3d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1f3e0 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65  count .    ** re
1f3f0 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65  aches 0, set the
1f400 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
1f410 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65   TRANS_NONE. The
1f420 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
1f430 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61  used().    ** ca
1f440 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e  ll below will un
1f450 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20  lock the pager. 
1f460 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   */.    if( p->i
1f470 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
1f480 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  NE ){.      clea
1f490 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
1f4a0 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
1f4b0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
1f4c0 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69  ction--;.      i
1f4d0 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
1f4e0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
1f4f0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1f500 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f  ction = TRANS_NO
1f510 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
1f520 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
1f530 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
1f540 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54  ction state to T
1f550 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e  RANS_NONE and un
1f560 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a  lock the .    **
1f570 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63   pager if this c
1f580 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f  all closed the o
1f590 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74  nly read or writ
1f5a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
1f5b0 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e  */.    p->inTran
1f5c0 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
1f5d0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
1f5e0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
1f5f0 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
1f600 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ity(p);.}../*.**
1f610 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   Commit the tran
1f620 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
1f630 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a  y in progress..*
1f640 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f650 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  e implements the
1f660 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
1f670 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69   a 2-phase commi
1f680 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74  t.  The.** sqlit
1f690 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1f6a0 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20  seOne() routine 
1f6b0 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
1f6c0 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a  hase and should.
1f6d0 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72  ** be invoked pr
1f6e0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74  ior to calling t
1f6f0 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68  his routine.  Th
1f700 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
1f710 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a  mmitPhaseOne().*
1f720 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c  * routine did al
1f730 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
1f740 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
1f750 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
1f760 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
1f770 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
1f780 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
1f790 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
1f7a0 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
1f7b0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
1f7c0 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
1f7d0 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
1f7e0 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64  or zero the head
1f7f0 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65  er in the.** the
1f800 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1f810 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20  l (which causes 
1f820 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1f830 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a  to commit) and.*
1f840 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a  * drop locks..**
1f850 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66  .** Normally, if
1f860 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1f870 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72   while the pager
1f880 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70   layer is attemp
1f890 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61  ting to .** fina
1f8a0 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lize the underly
1f8b0 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ing journal file
1f8c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1f8d0 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
1f8e0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65   and.** the uppe
1f8f0 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74  r layer will att
1f900 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  empt a rollback.
1f910 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
1f920 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1f930 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  .** is non-zero 
1f940 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65  then this b-tree
1f950 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1f960 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
1f970 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  file .** transac
1f980 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  tion. In this ca
1f990 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  se, the transact
1f9a0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1f9b0 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a  been committed .
1f9c0 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  ** (by deleting 
1f9d0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1f9e0 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63   file) and the c
1f9f0 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72  aller will ignor
1fa00 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  e this .** funct
1fa10 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65  ions return code
1fa20 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e  . So, even if an
1fa30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
1fa40 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
1fa50 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62  ,.** reset the b
1fa60 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e  -tree objects in
1fa70 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20  ternal state to 
1fa80 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
1fa90 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73  e write.** trans
1faa0 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  action has been 
1fab0 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20  closed. This is 
1fac0 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74  quite safe, as t
1fad0 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61  he pager will ha
1fae0 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ve.** transition
1faf0 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ed to the error 
1fb00 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  state..**.** Thi
1fb10 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
1fb20 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
1fb30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fb40 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
1fb50 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
1fb60 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
1fb70 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
1fb80 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
1fb90 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1fba0 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20  tPhaseTwo(Btree 
1fbb0 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70  *p, int bCleanup
1fbc0 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  ){..  if( p->inT
1fbd0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
1fbe0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1fbf0 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  _OK;.  sqlite3Bt
1fc00 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
1fc10 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1fc20 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
1fc30 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
1fc40 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
1fc50 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
1fc60 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
1fc70 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
1fc80 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
1fc90 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
1fca0 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
1fcb0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
1fcc0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1fcd0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53   int rc;.    BtS
1fce0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1fcf0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
1fd00 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1fd10 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1fd20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1fd30 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1fd40 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
1fd50 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1fd60 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
1fd70 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1fd80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1fd90 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b  & bCleanup==0 ){
1fda0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
1fdb0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
1fdc0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1fdd0 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61    }.    p->iData
1fde0 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43  Version--;  /* C
1fdf0 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50  ompensate for pP
1fe00 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
1fe10 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74  on++; */.    pBt
1fe20 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1fe30 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1fe40 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
1fe50 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
1fe60 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
1fe70 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
1fe80 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1fe90 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
1fea0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1feb0 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20   Do both phases 
1fec0 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a  of a commit..*/.
1fed0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1fee0 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29  Commit(Btree *p)
1fef0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1ff00 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1ff10 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
1ff20 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1ff30 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
1ff40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ff50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1ff60 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1ff70 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20  haseTwo(p, 0);. 
1ff80 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
1ff90 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1ffa0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ffb0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
1ffc0 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20  ts the state to 
1ffd0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64  CURSOR_FAULT and
1ffe0 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
1fff0 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f  de to errCode fo
20000 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f  r every cursor o
20010 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74  n any BtShared t
20020 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65  hat pBtree.** re
20030 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66  ferences.  Or if
20040 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
20050 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c  lag is set to 1,
20060 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72   then only.** tr
20070 69 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ip write cursors
20080 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20   and leave read 
20090 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65  cursors unchange
200a0 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63  d..**.** Every c
200b0 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69  ursor is a candi
200c0 64 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70  date to be tripp
200d0 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
200e0 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65  rsors.** that be
200f0 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61  long to other da
20100 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
20110 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
20120 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20  o be.** sharing 
20130 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
20140 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
20150 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
20160 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
20170 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66  lback occurs. If
20180 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a   the writeOnly.*
20190 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  * flag is true, 
201a0 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d  then only write-
201b0 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20  cursors need be 
201c0 74 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f  tripped - read-o
201d0 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73  nly.** cursors s
201e0 61 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e  ave their curren
201f0 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74  t positions so t
20200 68 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e  hat they may con
20210 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  tinue .** follow
20220 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
20230 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e  . Or, if writeOn
20240 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c  ly is false, all
20250 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a   cursors are .**
20260 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e   tripped. In gen
20270 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20  eral, writeOnly 
20280 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
20290 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e  transaction bein
202a0 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  g.** rolled back
202b0 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61   modified the da
202c0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
202d0 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72  n this case b-tr
202e0 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73  ee root.** pages
202f0 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72   may be moved or
20300 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68   deleted from th
20310 65 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67  e database altog
20320 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a  ether, making.**
20330 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72   it unsafe for r
20340 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63  ead cursors to c
20350 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  ontinue..**.** I
20360 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20  f the writeOnly 
20370 66 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64  flag is true and
20380 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
20390 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a  ountered while .
203a0 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75  ** saving the cu
203b0 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
203c0 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
203d0 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72  rsor, all cursor
203e0 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  s, .** including
203f0 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72   all read-cursor
20400 73 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a  s are tripped..*
20410 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
20420 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75  s returned if su
20430 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20  ccessful, or if 
20440 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
20450 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20  while.** saving 
20460 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  a cursor positio
20470 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  n, an SQLite err
20480 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  or code..*/.int 
20490 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
204a0 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65  AllCursors(Btree
204b0 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72   *pBtree, int er
204c0 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65  rCode, int write
204d0 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f  Only){.  BtCurso
204e0 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  r *p;.  int rc =
204f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
20500 73 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c  ssert( (writeOnl
20510 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c  y==0 || writeOnl
20520 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72  y==1) && BTCF_Wr
20530 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20  iteFlag==1 );.  
20540 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
20550 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
20560 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
20570 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
20580 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
20590 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
205a0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
205b0 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26  if( writeOnly &&
205c0 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
205d0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d  BTCF_WriteFlag)=
205e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
205f0 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  ( p->eState==CUR
20600 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e  SOR_VALID || p->
20610 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
20620 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20  KIPNEXT ){.     
20630 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75       rc = saveCu
20640 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
20650 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
20660 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20670 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
20680 64 29 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  d)sqlite3BtreeTr
20690 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  ipAllCursors(pBt
206a0 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20  ree, rc, 0);.   
206b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
206c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
206d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
206e0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
206f0 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
20700 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70  or(p);.        p
20710 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
20720 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20  R_FAULT;.       
20730 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65   p->skipNext = e
20740 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a  rrCode;.      }.
20750 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
20760 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  <=p->iPage; i++)
20770 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
20780 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b  ePage(p->apPage[
20790 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  i]);.        p->
207a0 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
207b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
207c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
207d0 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
207e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
207f0 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
20800 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
20810 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
20820 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73  * If tripCode is
20830 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74   not SQLITE_OK t
20840 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  hen cursors will
20850 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
20860 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e  (tripped)..** On
20870 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
20880 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20   are tripped if 
20890 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75  writeOnly is tru
208a0 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  e but all cursor
208b0 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64  s are.** tripped
208c0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
208d0 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74   false.  Any att
208e0 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61  empt to use.** a
208f0 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20   tripped cursor 
20900 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
20910 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
20920 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
20930 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
20940 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
20950 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
20960 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
20970 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
20980 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
20990 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
209a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
209b0 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  lback(Btree *p, 
209c0 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e  int tripCode, in
209d0 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
209e0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
209f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
20a00 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
20a10 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge1;..  assert( 
20a20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20  writeOnly==1 || 
20a30 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  writeOnly==0 );.
20a40 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f    assert( tripCo
20a50 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  de==SQLITE_ABORT
20a60 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69  _ROLLBACK || tri
20a70 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
20a80 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
20a90 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
20aa0 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
20ab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
20ac0 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
20ad0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
20ae0 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
20af0 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d  rc ) writeOnly =
20b00 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
20b10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20b20 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43  .  }.  if( tripC
20b30 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
20b40 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
20b50 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
20b60 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69  p, tripCode, wri
20b70 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73  teOnly);.    ass
20b80 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
20b90 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79  OK || (writeOnly
20ba0 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49  ==0 && rc2==SQLI
20bb0 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66  TE_OK) );.    if
20bc0 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
20bd0 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
20be0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
20bf0 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
20c00 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
20c10 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
20c20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
20c30 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
20c40 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
20c50 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
20c60 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
20c70 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
20c80 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
20c90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20ca0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
20cb0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
20cc0 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
20cd0 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
20ce0 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
20cf0 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
20d00 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
20d10 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
20d20 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
20d30 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
20d40 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
20d50 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
20d60 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
20d70 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
20d80 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
20d90 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
20da0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
20db0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
20dc0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
20dd0 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
20de0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
20df0 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
20e00 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
20e10 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
20e20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20e30 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
20e40 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
20e50 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
20e60 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
20e70 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
20e80 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
20e90 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
20ea0 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20  t, 1)==0 );.    
20eb0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
20ec0 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
20ed0 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
20ee0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
20ef0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
20f00 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
20f10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
20f20 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
20f30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
20f40 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
20f50 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
20f60 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
20f70 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
20f80 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
20f90 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
20fa0 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
20fb0 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
20fc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
20fd0 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
20fe0 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
20ff0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
21000 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
21010 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
21020 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
21030 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
21040 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
21050 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
21060 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
21070 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
21080 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
21090 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
210a0 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
210b0 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
210c0 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
210d0 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
210e0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
210f0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
21100 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
21110 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
21120 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
21130 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
21140 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
21150 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
21160 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
21170 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
21180 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
21190 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
211a0 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
211b0 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
211c0 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
211d0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
211e0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
211f0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
21200 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
21210 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
21220 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
21230 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
21240 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
21250 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
21260 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
21270 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
21280 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
21290 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
212a0 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
212b0 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
212c0 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
212d0 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
212e0 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
212f0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
21300 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
21310 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
21320 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
21330 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
21340 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
21350 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
21360 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
21370 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
21380 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
21390 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
213a0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
213b0 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
213c0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
213d0 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
213e0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
213f0 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
21400 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
21410 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
21420 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
21430 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
21440 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
21450 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
21460 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
21470 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
21480 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
21490 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
214a0 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
214b0 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
214c0 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
214d0 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
214e0 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
214f0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
21500 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
21510 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
21520 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
21530 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
21540 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
21550 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
21560 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
21570 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
21580 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
21590 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
215a0 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
215b0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
215c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
215d0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
215e0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
215f0 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
21600 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
21610 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
21620 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
21630 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
21640 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
21650 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
21660 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
21670 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
21680 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
21690 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
216a0 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
216b0 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
216c0 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
216d0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
216e0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
216f0 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
21700 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
21710 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
21720 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
21730 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
21740 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
21750 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
21760 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
21770 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
21780 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
21790 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
217a0 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
217b0 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
217c0 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
217d0 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
217e0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
217f0 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
21800 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
21810 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
21820 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
21830 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
21840 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21850 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
21860 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
21870 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
21880 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
21890 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
218a0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
218b0 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
218c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
218d0 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
218e0 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
218f0 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
21900 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
21910 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
21920 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
21930 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
21940 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
21950 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
21960 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
21970 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
21980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21990 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
219a0 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e  oint<0 && (pBt->
219b0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49  btsFlags & BTS_I
219c0 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21  NITIALLY_EMPTY)!
219d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =0 ){.        pB
219e0 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
219f0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
21a00 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
21a10 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
21a20 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
21a30 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  8 + pBt->pPage1-
21a40 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >aData);..      
21a50 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
21a60 73 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e  size was written
21a70 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74   into the offset
21a80 20 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65   28 of the heade
21a90 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  r.      ** when 
21aa0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
21ab0 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b  started, so we k
21ac0 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c  now that the val
21ad0 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20  ue at offset.   
21ae0 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a     ** 28 is nonz
21af0 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ero. */.      as
21b00 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
21b10 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
21b20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
21b30 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
21b40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21b50 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
21b60 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
21b70 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
21b80 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
21b90 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64  Table. If a read
21ba0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20  -only cursor is 
21bb0 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
21bc0 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
21bd0 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65   the caller alre
21be0 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74  ady has at least
21bf0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
21c00 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a  nsaction open.**
21c10 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
21c20 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77   already. If a w
21c30 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72  rite-cursor is r
21c40 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a  equested, then.*
21c50 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
21c60 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20  assumed to have 
21c70 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
21c80 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
21c90 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74   If wrFlag==0, t
21ca0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
21cb0 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  an only be used 
21cc0 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20  for reading..** 
21cd0 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68  If wrFlag==1, th
21ce0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
21cf0 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  n be used for re
21d00 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20  ading or for.** 
21d10 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72  writing if other
21d20 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20   conditions for 
21d30 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f  writing are also
21d40 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20   met.  These.** 
21d50 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  are the conditio
21d60 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  ns that must be 
21d70 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  met in order for
21d80 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62   writing to.** b
21d90 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a  e allowed:.**.**
21da0 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20   1:  The cursor 
21db0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
21dc0 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
21dd0 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  g==1.**.** 2:  O
21de0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
21df0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
21e00 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
21e10 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
21e20 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
21e30 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
21e40 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
21e50 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
21e60 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
21e70 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
21e80 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
21e90 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
21ea0 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
21eb0 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
21ec0 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
21ed0 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
21ee0 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
21ef0 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
21f00 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
21f10 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
21f20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
21f30 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
21f40 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
21f50 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
21f60 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
21f70 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
21f80 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
21f90 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
21fa0 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
21fb0 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
21fc0 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
21fd0 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
21fe0 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
21ff0 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
22000 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
22010 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
22020 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
22030 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
22040 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  d that the sqlit
22050 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
22060 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  o() has been cal
22070 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74  led.** on pCur t
22080 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
22090 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72   memory space pr
220a0 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
220b0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
220c0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
220d0 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
220e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22100 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
22110 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
22140 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
22150 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
22160 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
22190 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
221a0 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
221b0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
221c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
221d0 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
221e0 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
221f0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
22200 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
22210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
22220 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
22230 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  sor */.){.  BtSh
22240 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
22250 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
22260 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74     /* Shared b-t
22270 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ree handle */.  
22280 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20  BtCursor *pX;   
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e         /* Loopin
222b0 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c  g over other all
222c0 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61   cursors */..  a
222d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
222e0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
222f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
22300 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20  Flag==0 .       
22310 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45  || wrFlag==BTREE
22320 5f 57 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c  _WRCSR .       |
22330 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45  | wrFlag==(BTREE
22340 5f 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52  _WRCSR|BTREE_FOR
22350 44 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20  DELETE) .  );.. 
22360 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
22370 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
22380 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
22390 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
223a0 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
223b0 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
223c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
223d0 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
223e0 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
223f0 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
22400 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
22410 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
22420 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
22430 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
22440 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
22450 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
22460 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
22470 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
22480 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c  eyInfo!=0, (wrFl
22490 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73  ag?2:1)) );.  as
224a0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
224b0 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
224c0 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
224d0 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
224e0 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
224f0 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
22500 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
22510 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
22520 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
22530 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
22540 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
22550 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
22560 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
22570 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
22580 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
22590 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  1->aData );.  as
225a0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
225b0 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  || (pBt->btsFlag
225c0 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
225d0 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  Y)==0 );..  if( 
225e0 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c  wrFlag ){.    al
225f0 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
22600 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42  pBt);.    if( pB
22610 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20  t->pTmpSpace==0 
22620 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
22630 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
22640 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74   iTable==1 && bt
22650 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
22660 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
22670 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b  rt( wrFlag==0 );
22680 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b  .    iTable = 0;
22690 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74  .  }..  /* Now t
226a0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72  hat no other err
226b0 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66  ors can occur, f
226c0 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e  inish filling in
226d0 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20   the BtCursor.  
226e0 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64  ** variables and
226f0 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
22700 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
22710 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70  ed list.  */.  p
22720 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  Cur->pgnoRoot = 
22730 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20  (Pgno)iTable;.  
22740 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31  pCur->iPage = -1
22750 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ;.  pCur->pKeyIn
22760 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
22770 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
22780 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d  p;.  pCur->pBt =
22790 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75   pBt;.  pCur->cu
227a0 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20  rFlags = wrFlag 
227b0 3f 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  ? BTCF_WriteFlag
227c0 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   : 0;.  pCur->cu
227d0 72 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72  rPagerFlags = wr
227e0 46 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52  Flag ? 0 : PAGER
227f0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  _GET_READONLY;. 
22800 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
22810 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72   two or more cur
22820 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  sors on the same
22830 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c   btree, then all
22840 20 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f   such.  ** curso
22850 72 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74  rs *must* have t
22860 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  he BTCF_Multiple
22870 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20   flag set. */.  
22880 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72  for(pX=pBt->pCur
22890 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  sor; pX; pX=pX->
228a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
228b0 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50  pX->pgnoRoot==(P
228c0 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20  gno)iTable ){.  
228d0 20 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73      pX->curFlags
228e0 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c   |= BTCF_Multipl
228f0 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63  e;.      pCur->c
22900 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
22910 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a  Multiple;.    }.
22920 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78    }.  pCur->pNex
22930 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
22940 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  ;.  pBt->pCursor
22950 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d   = pCur;.  pCur-
22960 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
22970 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75  _INVALID;.  retu
22980 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22990 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
229a0 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20  Cursor(.  Btree 
229b0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
229c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
229e0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
229f0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a10 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
22a20 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
22a30 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
22a40 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
22a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a60 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
22a70 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
22a80 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
22a90 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
22aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22ab0 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78  * First arg to x
22ac0 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42  Compare() */.  B
22ad0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
22b00 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68  ite new cursor h
22b10 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
22b20 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65  rc;.  if( iTable
22b30 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <1 ){.    rc = S
22b40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
22b50 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
22b60 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
22b70 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  er(p);.    rc = 
22b80 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69  btreeCursor(p, i
22b90 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70  Table, wrFlag, p
22ba0 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a  KeyInfo, pCur);.
22bb0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22bc0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
22bd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22be0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
22bf0 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f  ize of a BtCurso
22c00 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65  r object in byte
22c10 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e  s..**.** This in
22c20 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64  terfaces is need
22c30 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73  ed so that users
22c40 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20   of cursors can 
22c50 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73  preallocate.** s
22c60 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67  ufficient storag
22c70 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73  e to hold a curs
22c80 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f  or.  The BtCurso
22c90 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71  r object is opaq
22ca0 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73  ue.** to users s
22cb0 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f  o they cannot do
22cc0 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68   the sizeof() th
22cd0 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20  emselves - they 
22ce0 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69  must call.** thi
22cf0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e  s routine..*/.in
22d00 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
22d10 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a  rsorSize(void){.
22d20 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28    return ROUND8(
22d30 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
22d40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
22d50 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68  ialize memory th
22d60 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  at will be conve
22d70 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75  rted into a BtCu
22d80 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  rsor object..**.
22d90 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70  ** The simple ap
22da0 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c  proach here woul
22db0 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29  d be to memset()
22dc0 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65   the entire obje
22dd0 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20  ct.** to zero.  
22de0 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74  But it turns out
22df0 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65   that the apPage
22e00 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61  [] and aiIdx[] a
22e10 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20  rrays.** do not 
22e20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65  need to be zeroe
22e30 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c  d and they are l
22e40 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20  arge, so we can 
22e50 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66  save a lot.** of
22e60 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69   run-time by ski
22e70 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61  pping the initia
22e80 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73  lization of thos
22e90 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76  e elements..*/.v
22ea0 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
22eb0 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72  CursorZero(BtCur
22ec0 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65  sor *p){.  memse
22ed0 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66  t(p, 0, offsetof
22ee0 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65  (BtCursor, iPage
22ef0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ));.}../*.** Clo
22f00 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
22f10 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
22f20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22f30 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
22f40 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
22f50 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
22f60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22f70 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
22f80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
22f90 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
22fa0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
22fb0 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
22fc0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
22fd0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
22fe0 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  Cur->pBt;.    sq
22ff0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
23000 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c  pBtree);.    sql
23010 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
23020 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20  rsor(pCur);.    
23030 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75  assert( pBt->pCu
23040 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 69  rsor!=0 );.    i
23050 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  f( pBt->pCursor=
23060 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 70  =pCur ){.      p
23070 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
23080 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
23090 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43 75  else{.      BtCu
230a0 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70 42  rsor *pPrev = pB
230b0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20  t->pCursor;.    
230c0 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66    do{.        if
230d0 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ( pPrev->pNext==
230e0 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20  pCur ){.        
230f0 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d    pPrev->pNext =
23100 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
23110 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23130 20 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d 3e   pPrev = pPrev->
23140 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77 68  pNext;.      }wh
23150 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72 65  ile( ALWAYS(pPre
23160 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  v) );.    }.    
23170 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
23180 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
23190 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
231a0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
231b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
231c0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
231d0 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
231e0 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f  e3_free(pCur->aO
231f0 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a  verflow);.    /*
23200 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
23210 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ur); */.    sqli
23220 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
23230 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
23240 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23250 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
23260 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
23270 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
23280 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
23290 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
232a0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
232b0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
232c0 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
232d0 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
232e0 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
232f0 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
23300 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
23310 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
23320 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
23330 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
23340 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
23350 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
23360 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
23370 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
23380 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
23390 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61  .  static void a
233a0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74  ssertCellInfo(Bt
233b0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
233c0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
233d0 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  ;.    int iPage 
233e0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
233f0 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
23400 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
23410 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
23420 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
23430 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  ge[iPage], pCur-
23440 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26  >aiIdx[iPage], &
23450 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
23460 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
23470 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26   memcmp(&info, &
23480 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65  pCur->info, size
23490 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a  of(info))==0 );.
234a0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
234b0 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
234c0 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61  fo(x).#endif.sta
234d0 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
234e0 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  INE void getCell
234f0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
23500 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72  Cur){.  if( pCur
23510 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
23520 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  ){.    int iPage
23530 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
23540 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
23550 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
23560 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50  NKey;.    btreeP
23570 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
23580 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
23590 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
235a0 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
235b0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
235c0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
235d0 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
235e0 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
235f0 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
23600 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
23610 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
23620 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
23630 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
23640 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
23650 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
23660 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
23670 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
23680 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
23690 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
236a0 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
236b0 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
236c0 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
236d0 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
236e0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
236f0 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
23700 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
23710 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
23720 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
23730 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
23740 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23750 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
23760 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  * NDEBUG */../*.
23770 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
23780 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
23790 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74   buffer needed t
237a0 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65  o hold the value
237b0 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66   of.** the key f
237c0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
237d0 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75  ntry.  If the cu
237e0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
237f0 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
23800 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65  id entry, *pSize
23810 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a   is set to 0. .*
23820 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65  *.** For a table
23830 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59   with the INTKEY
23840 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20   flag set, this 
23850 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
23860 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c  the key.** itsel
23870 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65  f, not the numbe
23880 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
23890 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
238a0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73   caller must pos
238b0 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ition the cursor
238c0 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
238d0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
238e0 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
238f0 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
23900 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74  .  It always ret
23910 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
23920 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
23930 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43  BtreeKeySize(BtC
23940 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
23950 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
23960 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23970 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23980 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
23990 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
239a0 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
239b0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53  nfo(pCur);.  *pS
239c0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
239d0 2e 6e 4b 65 79 3b 0a 20 20 72 65 74 75 72 6e 20  .nKey;.  return 
239e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
239f0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
23a00 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
23a10 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
23a20 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
23a30 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
23a40 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
23a50 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
23a60 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
23a70 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
23a80 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e   pointing to a n
23a90 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64  on-NULL.** valid
23aa0 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65   entry.  In othe
23ab0 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c  r words, the cal
23ac0 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d  ling procedure m
23ad0 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a  ust guarantee.**
23ae0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
23af0 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61   has Cursor.eSta
23b00 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
23b10 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20  ..**.** Failure 
23b20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
23b30 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
23b40 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
23b50 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20  QLITE_OK..** It 
23b60 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65  might just as we
23b70 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72  ll be a procedur
23b80 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69  e (returning voi
23b90 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e  d) but we contin
23ba0 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20  ue.** to return 
23bb0 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c  an integer resul
23bc0 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f  t code for histo
23bd0 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a  rical reasons..*
23be0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
23bf0 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
23c00 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
23c10 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
23c20 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
23c30 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
23c40 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
23c50 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
23c60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23c70 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a  ur->iPage>=0 );.
23c80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23c90 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
23ca0 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  AX_DEPTH );.  as
23cb0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
23cc0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
23cd0 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20 29  >intKeyLeaf==1 )
23ce0 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
23cf0 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20  pCur);.  *pSize 
23d00 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
23d10 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
23d20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
23d30 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
23d40 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
23d50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
23d60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
23d70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
23d80 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
23d90 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
23da0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
23db0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
23dc0 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
23dd0 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
23de0 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
23df0 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
23e00 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
23e10 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
23e20 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
23e30 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
23e40 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
23e50 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
23e60 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
23e70 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
23e80 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
23e90 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
23ea0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
23eb0 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
23ec0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
23ed0 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
23ee0 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
23ef0 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
23f00 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
23f10 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
23f20 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
23f30 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
23f40 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
23f50 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
23f60 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
23f70 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
23f80 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
23f90 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
23fa0 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
23fb0 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
23fc0 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
23fd0 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
23fe0 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
23ff0 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
24000 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
24010 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
24020 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
24030 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
24040 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
24050 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
24060 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
24070 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
24080 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
24090 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
240a0 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
240b0 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
240c0 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
240d0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
240e0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
240f0 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
24100 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
24110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24120 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24130 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c   */.  Pgno ovfl,
24140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24150 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76     /* Current ov
24160 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
24170 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  er */.  MemPage 
24180 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
24190 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
241a0 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79  Page handle (may
241b0 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50   be NULL) */.  P
241c0 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
241d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
241e0 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
241f0 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
24200 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
24210 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
24220 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
24230 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24240 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
24250 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
24260 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
24270 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74  assert(pPgnoNext
24280 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
24290 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
242a0 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
242b0 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
242c0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
242d0 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
242e0 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
242f0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
24300 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
24310 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
24320 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
24330 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
24340 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
24350 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
24360 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
24370 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
24380 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
24390 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
243a0 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
243b0 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
243c0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
243d0 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
243e0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
243f0 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
24400 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
24410 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
24420 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
24430 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
24440 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
24450 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
24460 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
24470 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
24480 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
24490 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62     if( iGuess<=b
244a0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
244b0 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
244c0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
244d0 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20  iGuess, &eType, 
244e0 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  &pgno);.      if
244f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24500 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
24510 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
24520 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
24530 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
24540 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
24550 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
24560 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
24570 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
24580 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d   next==0 || rc==
24590 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
245a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
245b0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
245c0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
245d0 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28   ovfl, &pPage, (
245e0 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47  ppPage==0) ? PAG
245f0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
24600 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
24610 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24620 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
24630 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
24650 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
24660 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
24670 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
24680 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
24690 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
246a0 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
246b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
246c0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
246d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
246e0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
246f0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
24700 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
24710 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
24720 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
24730 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
24740 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
24750 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
24760 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
24770 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
24780 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
24790 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
247a0 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
247b0 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
247c0 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
247d0 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
247e0 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
247f0 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
24800 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
24810 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
24820 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
24830 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
24840 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
24850 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
24860 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
24870 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
24880 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
24890 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
248a0 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
248b0 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
248c0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
248d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
248e0 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
248f0 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
24900 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
24910 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
24920 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
24930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24940 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
24950 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
24960 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24970 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
24980 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
24990 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
249a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
249b0 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
249c0 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
249d0 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
249e0 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
249f0 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
24a00 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
24a10 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
24a20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
24a30 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
24a40 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
24a50 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
24a60 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
24a70 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
24a80 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
24a90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
24aa0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
24ab0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
24ac0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
24ad0 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
24ae0 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
24af0 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
24b00 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
24b10 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
24b20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
24b30 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
24b40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
24b50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
24b60 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
24b70 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
24b80 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
24b90 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
24ba0 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
24bb0 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
24bc0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
24bd0 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a  ing to. The eOp.
24be0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
24bf0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
24c00 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  llows:.**.**   0
24c10 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
24c20 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c  is a read. Popul
24c30 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
24c40 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20   cache..**   1: 
24c50 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
24c60 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61   a write. Popula
24c70 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
24c80 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54  cache..**   2: T
24c90 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
24ca0 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70  a read. Do not p
24cb0 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
24cc0 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  flow cache..**.*
24cd0 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
24ce0 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
24cf0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
24d00 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
24d10 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
24d20 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
24d30 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
24d40 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
24d50 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20  t being read or 
24d60 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70  written might ap
24d70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
24d80 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73   page.** or be s
24d90 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
24da0 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
24db0 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  w pages..**.** I
24dc0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  f the current cu
24dd0 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
24de0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
24df0 66 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74  flow pages and t
24e00 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65  he.** eOp argume
24e10 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69  nt is not 2, thi
24e20 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
24e30 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
24e40 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a  r and lazily .**
24e50 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f   populates the o
24e60 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
24e70 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  t cache array (B
24e80 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
24e90 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65  w). .** Subseque
24ea0 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
24eb0 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  s cache to make 
24ec0 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
24ed0 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a  upplied offset .
24ee0 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ** more efficien
24ef0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
24f00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
24f10 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
24f20 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
24f30 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
24f40 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
24f50 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
24f60 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
24f70 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
24f80 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
24f90 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
24fa0 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
24fb0 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
24fc0 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
24fd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
24fe0 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
24ff0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
25000 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
25010 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
25020 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
25030 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
25040 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
25050 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
25060 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
25070 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
25080 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
25090 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
250a0 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
250b0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
250c0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
250d0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
250e0 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
250f0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
25100 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
25110 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
25120 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
25130 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
25140 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
25150 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
25160 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
25170 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
25180 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
25190 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
251a0 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
251b0 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
251c0 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
251d0 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
251e0 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
251f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
25200 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
25210 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25220 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
25230 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
25240 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25250 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42  ur->iPage]; /* B
25260 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
25270 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
25280 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
25290 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20  pCur->pBt;      
252a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
252b0 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
252c0 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23   belongs to */.#
252d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
252e0 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
252f0 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  D.  unsigned cha
25300 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74  r * const pBufSt
25310 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e  art = pBuf;.  in
25320 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t bEnd;         
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25340 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
25350 69 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e  if reading to en
25360 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e  d of data */.#en
25370 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
25380 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
25390 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
253a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
253b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
253c0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
253d0 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
253e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
253f0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
25400 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
25410 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65   eOp!=2 || offse
25420 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c  t==0 );    /* Al
25430 77 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20  ways start from 
25440 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f  beginning for eO
25450 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65  p==2 */..  getCe
25460 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
25470 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
25480 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
25490 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
254a0 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
254b0 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73  AD.  bEnd = offs
254c0 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e  et+amt==pCur->in
254d0 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e  fo.nPayload;.#en
254e0 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66  dif.  assert( of
254f0 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72  fset+amt <= pCur
25500 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ->info.nPayload 
25510 29 3b 0a 0a 20 20 69 66 28 20 26 61 50 61 79 6c  );..  if( &aPayl
25520 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
25530 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
25540 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
25550 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 2f  leSize] ){.    /
25560 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
25570 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
25580 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
25590 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
255a0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
255b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
255c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
255d0 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
255e0 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
255f0 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
25600 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
25610 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
25620 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
25630 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
25640 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
25650 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
25660 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
25670 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
25680 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
25690 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
256a0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
256b0 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
256c0 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78  uf, a, (eOp & 0x
256d0 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  01), pPage->pDbP
256e0 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
256f0 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
25700 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
25710 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
25720 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
25730 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
25740 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
25750 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
25760 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
25770 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
25780 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
25790 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
257a0 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
257b0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
257c0 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
257d0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
257e0 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
257f0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
25800 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74      /* If the Bt
25810 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
25820 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  [] has not been 
25830 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
25840 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ate it now..    
25850 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  ** Except, do no
25860 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72  t allocate aOver
25870 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d  flow[] for eOp==
25880 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
25890 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   The aOverflow[]
258a0 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
258b0 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  at one entry for
258c0 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
258d0 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  age.    ** in th
258e0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
258f0 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  . The page numbe
25900 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
25910 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a  verflow page is.
25920 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e      ** stored in
25930 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65   aOverflow[0], e
25940 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
25950 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
25960 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  w[] array.    **
25970 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
25980 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68  known" (the cach
25990 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
259a0 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
259b0 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26     if( eOp!=2 &&
259c0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
259d0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
259e0 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)==0 ){.      i
259f0 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
25a00 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
25a10 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25a20 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
25a30 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  flSize;.      if
25a40 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f  ( nOvfl>pCur->nO
25a50 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  vflAlloc ){.    
25a60 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d      Pgno *aNew =
25a70 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52   (Pgno*)sqlite3R
25a80 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
25a90 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
25aa0 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a  low, nOvfl*2*siz
25ab0 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20  eof(Pgno).      
25ac0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
25ad0 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
25ae0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25af0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
25b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25b10 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c    pCur->nOvflAll
25b20 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20  oc = nOvfl*2;.  
25b30 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
25b40 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a  verflow = aNew;.
25b50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25b60 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
25b70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25b80 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
25b90 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
25ba0 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
25bb0 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  o));.        pCu
25bc0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
25bd0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20  TCF_ValidOvfl;. 
25be0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
25bf0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
25c00 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
25c10 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
25c20 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
25c30 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
25c40 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
25c50 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
25c60 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
25c70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
25c80 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
25c90 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
25ca0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
25cb0 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20  lidOvfl)!=0.    
25cc0 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
25cd0 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53  low[offset/ovflS
25ce0 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  ize].    ){.    
25cf0 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
25d00 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
25d10 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
25d20 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
25d30 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  x];.      offset
25d40 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
25d50 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ize);.    }..   
25d60 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
25d70 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
25d80 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
25d90 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ++){..      /* I
25da0 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
25db0 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
25dc0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
25dd0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
25de0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
25df0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
25e00 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
25e10 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 4f  assert( pCur->aO
25e20 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30  verflow[iIdx]==0
25e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25e40 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
25e50 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
25e60 61 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  age.            
25e70 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
25e80 42 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  B );.        pCu
25e90 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
25ea0 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
25eb0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
25ec0 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69  ( offset>=ovflSi
25ed0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ze ){.        /*
25ee0 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e   The only reason
25ef0 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
25f00 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20  ge is to obtain 
25f10 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
25f20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74   ** number for t
25f30 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
25f40 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
25f50 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20  in. The page.   
25f60 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20       ** data is 
25f70 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f  not required. So
25f80 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f   first try to lo
25f90 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f  okup the overflo
25fa0 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  w.        ** pag
25fb0 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66  e-list cache, if
25fc0 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20   any, then fall 
25fd0 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f  back to the getO
25fe0 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20  verflowPage().  
25ff0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
26000 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
26010 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
26020 61 74 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  at the aOverflow
26030 5b 5d 20 61 72 72 61 79 20 6d 75 73 74 20 62 65  [] array must be
26040 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75   allocated becau
26050 73 65 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20  se eOp!=2.      
26060 20 20 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65    ** here.  If e
26070 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73  Op==2, then offs
26080 65 74 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62  et==0 and this b
26090 72 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74  ranch is never t
260a0 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aken..        */
260b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
260c0 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20   eOp!=2 );.     
260d0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
260e0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
260f0 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20  _ValidOvfl );.  
26100 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
26110 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d  ur->pBtree->db==
26120 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20  pBt->db );.     
26130 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
26140 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
26150 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
26160 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
26170 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
26180 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26190 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
261a0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
261b0 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
261c0 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
261d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66      }.        of
261e0 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
261f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26200 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
26210 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
26220 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
26230 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
26240 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
26250 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
26260 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
26270 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
26280 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
26290 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53       */.#ifdef S
262a0 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
262b0 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
262c0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
262d0 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  *fd;.#endif.    
262e0 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
262f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b  .        if( a +
26300 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69   offset > ovflSi
26310 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
26320 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
26330 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  ffset;.        }
26340 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
26350 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
26360 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20  READ.        /* 
26370 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f  If all the follo
26380 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
26390 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
263a0 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69    **   1) this i
263b0 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69  s a read operati
263c0 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20  on, and .       
263d0 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73   **   2) data is
263e0 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74   required from t
263f0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
26400 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
26410 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
26420 20 33 29 20 74 68 65 20 64 61 74 61 62 61 73 65   3) the database
26430 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c   is file-backed,
26440 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
26450 20 20 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f    4) there is no
26460 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e   open write-tran
26470 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
26480 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65       **   5) the
26490 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
264a0 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
264b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29  .        **   6)
264c0 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74   all data from t
264d0 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
264e0 20 72 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a   read..        *
264f0 2a 20 20 20 37 29 20 61 74 20 6c 65 61 73 74 20  *   7) at least 
26500 34 20 62 79 74 65 73 20 68 61 76 65 20 61 6c 72  4 bytes have alr
26510 65 61 64 79 20 62 65 65 6e 20 72 65 61 64 20 69  eady been read i
26520 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
26530 75 66 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a  uffer .        *
26540 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
26550 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65  n data can be re
26560 61 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ad directly from
26570 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26580 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  le into the.    
26590 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75      ** output bu
265a0 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20  ffer, bypassing 
265b0 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
265c0 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20  ltogether. This 
265d0 73 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a  speeds.        *
265e0 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72  * up loading lar
265f0 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
26600 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c  span many overfl
26610 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20  ow pages..      
26620 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
26630 20 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20   (eOp&0x01)==0  
26640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26660 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20      /* (1) */.  
26670 20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74         && offset
26680 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
26690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
266b0 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (2) */.         
266c0 26 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f  && (bEnd || a==o
266d0 76 66 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20  vflSize)        
266e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266f0 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a        /* (6) */.
26700 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
26710 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
26720 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20  TRANS_READ      
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26740 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (4) */.       
26750 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74    && (fd = sqlit
26760 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
26770 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68  >pPager))->pMeth
26780 6f 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a  ods     /* (3) *
26790 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42  /.         && pB
267a0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
267b0 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20  [19]==0x01      
267c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267d0 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20   /* (5) */.     
267e0 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d      && &pBuf[-4]
267f0 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20  >=pBufStart     
26800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29            /* (7)
26820 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
26830 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76           u8 aSav
26840 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[4];.          
26850 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42  u8 *aWrite = &pB
26860 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20  uf[-4];.        
26870 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65    assert( aWrite
26880 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20  >=pBufStart );  
26890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268a0 20 20 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20         /* hence 
268b0 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (7) */.         
268c0 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61   memcpy(aSave, a
268d0 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20  Write, 4);.     
268e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
268f0 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69  3OsRead(fd, aWri
26900 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42  te, a+4, (i64)pB
26910 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78  t->pageSize*(nex
26920 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20  tPage-1));.     
26930 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
26940 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29  get4byte(aWrite)
26950 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
26960 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65  py(aWrite, aSave
26970 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
26980 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  lse.#endif..    
26990 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
269a0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
269b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
269c0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
269d0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
269e0 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c  tPage, &pDbPage,
269f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
26a00 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f 20  (eOp&0x01)==0 ? 
26a10 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
26a20 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  LY : 0).        
26a30 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
26a40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26a50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26a60 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
26a70 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
26a80 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
26a90 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
26aa0 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
26ab0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
26ac0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
26ad0 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
26ae0 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28  t+4], pBuf, a, (
26af0 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62 50 61  eOp&0x01), pDbPa
26b00 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
26b10 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
26b20 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
26b30 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20           offset 
26b40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
26b50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26b60 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20     amt -= a;.   
26b70 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a       pBuf += a;.
26b80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
26b90 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
26ba0 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
26bb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
26bc0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
26bd0 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
26be0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
26bf0 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65  d part of the ke
26c00 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
26c10 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
26c20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
26c30 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
26c40 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20  ransferred into 
26c50 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
26c60 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
26c70 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
26c80 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
26c90 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70  st ensure that p
26ca0 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
26cb0 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a  to a valid row.*
26cc0 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  * in the table..
26cd0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
26ce0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
26cf0 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
26d00 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
26d10 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
26d20 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
26d30 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
26d40 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
26d50 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
26d60 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
26d70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
26d80 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
26d90 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
26da0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
26db0 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Buf){.  assert( 
26dc0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
26dd0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
26de0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
26df0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
26e00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
26e10 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
26e20 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26e30 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
26e40 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
26e50 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
26e60 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26e70 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
26e80 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73  ;.  return acces
26e90 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
26ea0 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
26eb0 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
26ec0 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
26ed0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
26ee0 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
26ef0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
26f00 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
26f10 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
26f20 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
26f30 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
26f40 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
26f50 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
26f60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
26f70 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
26f80 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
26f90 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
26fa0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
26fb0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
26fc0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
26fd0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
26fe0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
26ff0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
27000 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
27010 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
27020 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
27030 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
27040 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
27050 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27060 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
27070 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
27080 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
27090 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
270a0 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
270b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
270c0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
270d0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
270e0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
270f0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
27100 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
27110 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
27120 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
27130 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
27140 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27150 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
27160 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
27170 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
27180 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27190 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
271a0 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
271b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
271c0 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
271d0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
271e0 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
271f0 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   pBuf, 0);.  }. 
27200 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27210 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
27220 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
27230 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
27240 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
27250 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
27260 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
27270 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
27280 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
27290 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
272a0 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72  key if index btr
272b0 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
272c0 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68  ey==0) and is th
272d0 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61  e data for.** ta
272e0 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67  ble btrees (pPag
272f0 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54  e->intKey==1). T
27300 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
27310 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a  es of available.
27320 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  ** key/data is w
27330 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d  ritten into *pAm
27340 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
27350 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a   then the value.
27360 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ** returned will
27370 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20   not be a valid 
27380 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
27390 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
273a0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
273b0 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
273c0 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
273d0 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
273e0 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
273f0 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
27400 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
27410 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
27420 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
27430 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
27440 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
27450 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
27460 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
27470 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
27480 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
27490 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
274a0 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
274b0 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
274c0 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
274d0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
274e0 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
274f0 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
27500 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
27510 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
27520 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
27530 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
27540 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
27550 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
27560 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
27570 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
27580 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
27590 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
275a0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
275b0 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
275c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
275d0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76  /.static const v
275e0 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  oid *fetchPayloa
275f0 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
27600 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
27610 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
27620 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
27630 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d  om */.  u32 *pAm
27640 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
27650 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
27660 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
27670 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  tes here */.){. 
27680 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73 65   u32 amt;.  asse
27690 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
276a0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
276b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
276c0 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61  ur->iPage]);.  a
276d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
276e0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
276f0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  D );.  assert( s
27700 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
27710 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
27720 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
27730 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
27740 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
27750 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27760 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27770 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
27780 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
27790 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
277a0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
277b0 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ize>0 );.  asser
277c0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  t( pCur->info.pP
277d0 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61 70 50  ayload>pCur->apP
277e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
277f0 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55  ->aData || CORRU
27800 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
27810 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  t( pCur->info.pP
27820 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61 70 50  ayload<pCur->apP
27830 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27840 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52  ->aDataEnd ||COR
27850 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20  RUPT_DB);.  amt 
27860 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 61 70  = (int)(pCur->ap
27870 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27880 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43  ]->aDataEnd - pC
27890 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
278a0 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  d);.  if( pCur->
278b0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20  info.nLocal<amt 
278c0 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e  ) amt = pCur->in
278d0 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41  fo.nLocal;.  *pA
278e0 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65 74 75  mt = amt;.  retu
278f0 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e  rn (void*)pCur->
27900 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d  info.pPayload;.}
27910 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
27920 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
27930 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
27940 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
27950 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
27960 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
27970 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
27980 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
27990 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
279a0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
279b0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
279c0 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
279d0 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
279e0 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
279f0 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
27a00 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
27a10 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
27a20 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
27a30 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
27a40 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
27a50 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
27a60 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
27a70 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
27a80 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
27a90 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
27aa0 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
27ab0 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
27ac0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
27ad0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
27ae0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
27af0 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
27b00 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
27b10 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
27b20 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
27b30 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
27b40 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
27b50 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
27b60 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65   *sqlite3BtreeKe
27b70 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  yFetch(BtCursor 
27b80 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74  *pCur, u32 *pAmt
27b90 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63  ){.  return fetc
27ba0 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
27bb0 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f  Amt);.}.const vo
27bc0 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
27bd0 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73  DataFetch(BtCurs
27be0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
27bf0 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
27c00 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
27c10 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , pAmt);.}.../*.
27c20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
27c30 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
27c40 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
27c50 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
27c60 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
27c70 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
27c80 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
27c90 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ve to..**.** Thi
27ca0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
27cb0 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
27cc0 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65  T if the page-he
27cd0 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64  ader flags field
27ce0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63   of.** the new c
27cf0 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e  hild page does n
27d00 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61  ot match the fla
27d10 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  gs field of the 
27d20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20  parent (i.e..** 
27d30 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67  if an intkey pag
27d40 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
27d50 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20  the parent of a 
27d60 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c  non-intkey page,
27d70 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73   or.** vice-vers
27d80 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  a)..*/.static in
27d90 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
27da0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
27db0 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74  2 newPgno){.  Bt
27dc0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
27dd0 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ur->pBt;..  asse
27de0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
27df0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
27e00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
27e10 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
27e20 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
27e30 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
27e40 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
27e50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27e60 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20  ->iPage>=0 );.  
27e70 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
27e80 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  =(BTCURSOR_MAX_D
27e90 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72  EPTH-1) ){.    r
27ea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
27eb0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
27ec0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
27ed0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
27ee0 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
27ef0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
27f00 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70  _ValidOvfl);.  p
27f10 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20  Cur->iPage++;.  
27f20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27f30 2d 3e 69 50 61 67 65 5d 20 3d 20 30 3b 0a 20 20  ->iPage] = 0;.  
27f40 72 65 74 75 72 6e 20 67 65 74 41 6e 64 49 6e 69  return getAndIni
27f50 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67  tPage(pBt, newPg
27f60 6e 6f 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  no, &pCur->apPag
27f70 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a  e[pCur->iPage],.
27f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f90 20 20 20 20 20 20 20 20 70 43 75 72 2c 20 70 43          pCur, pC
27fa0 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
27fb0 73 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  s);.}..#if SQLIT
27fc0 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61  E_DEBUG./*.** Pa
27fd0 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
27fe0 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
27ff0 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
28000 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
28010 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
28020 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
28030 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
28040 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
28050 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
28060 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
28070 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
28080 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
28090 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
280a0 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
280b0 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
280c0 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
280d0 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
280e0 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
280f0 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
28100 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
28110 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
28120 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
28130 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54  ){.  if( CORRUPT
28140 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  _DB ) return;  /
28150 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  * The conditions
28160 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69   tested below mi
28170 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a  ght not be true.
28180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28190 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
281a0 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  n a corrupt data
281b0 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  base */.  assert
281c0 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
281d0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
281e0 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
281f0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
28200 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
28210 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
28220 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
28230 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
28240 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
28250 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
28260 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
28270 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
28280 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
28290 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
282a0 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
282b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
282c0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
282d0 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
282e0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
282f0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
28300 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
28310 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
28320 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
28330 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
28340 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
28350 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
28360 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
28370 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
28380 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
28390 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
283a0 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
283b0 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
283c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
283d0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
283e0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
283f0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
28400 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
28410 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28420 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28430 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
28440 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
28450 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
28460 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
28470 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
28480 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
28490 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
284a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
284b0 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
284c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
284d0 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
284e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
284f0 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  e]->pgno.  );.  
28500 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e  testcase( pCur->
28510 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
28520 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50  e-1] > pCur->apP
28530 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
28540 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70  1]->nCell );.  p
28550 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
28560 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
28570 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
28580 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
28590 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 6c  alidOvfl);.  rel
285a0 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
285b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
285c0 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 7d 0a  r->iPage--]);.}.
285d0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
285e0 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
285f0 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
28600 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73   of its b-tree s
28610 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
28620 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  If the table has
28630 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
28640 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63  page, then the c
28650 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
28660 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68  o point.** to th
28670 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  e virtual root p
28680 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74  age instead of t
28690 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
286a0 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73  age. A table has
286b0 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f   a.** virtual ro
286c0 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65  ot page when the
286d0 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
286e0 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
286f0 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69  lls and a .** si
28700 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e  ngle child page.
28710 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   This can only h
28720 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74  appen with the t
28730 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70  able rooted at p
28740 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age 1..**.** If 
28750 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  the b-tree struc
28760 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ture is empty, t
28770 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
28780 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55  is set to .** CU
28790 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74  RSOR_INVALID. Ot
287a0 68 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72  herwise, the cur
287b0 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f  sor is set to po
287c0 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  int to the first
287d0 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64  .** cell located
287e0 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72   on the root (or
287f0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70   virtual root) p
28800 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73  age and the curs
28810 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73  or state.** is s
28820 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c  et to CURSOR_VAL
28830 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ID..**.** If thi
28840 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
28850 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ns successfully,
28860 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d   it may be assum
28870 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70  ed that the.** p
28880 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73  age-header flags
28890 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
288a0 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f  he [virtual] roo
288b0 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78  t-page is the ex
288c0 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20  pected .** kind 
288d0 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28  of b-tree page (
288e0 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65  i.e. if when ope
288f0 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
28900 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e  the caller did n
28910 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20  ot.** specify a 
28920 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
28930 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
28940 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20   is set to 0x05 
28950 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69  or 0x0D,.** indi
28960 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62  cating a table b
28970 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65  -tree, or if the
28980 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63   caller did spec
28990 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a  ify a KeyInfo .*
289a0 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  * structure the 
289b0 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
289c0 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30  t to 0x02 or 0x0
289d0 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e  A, indicating an
289e0 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65   index.** b-tree
289f0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
28a00 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
28a10 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
28a20 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
28a30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28a40 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
28a50 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
28a60 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
28a70 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
28a80 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
28a90 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
28aa0 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
28ab0 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
28ac0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
28ad0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
28ae0 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
28af0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
28b00 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
28b10 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
28b20 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
28b30 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28b40 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
28b50 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
28b60 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
28b70 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65  E_OK );.      re
28b80 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
28b90 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ext;.    }.    s
28ba0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
28bb0 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
28bc0 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  }..  if( pCur->i
28bd0 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77  Page>=0 ){.    w
28be0 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67  hile( pCur->iPag
28bf0 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
28c00 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
28c10 70 43 75 72 2d 3e 69 50 61 67 65 5d 21 3d 30 20  pCur->iPage]!=0 
28c20 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
28c30 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72  PageNotNull(pCur
28c40 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28c50 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a  Page--]);.    }.
28c60 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72    }else if( pCur
28c70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b  ->pgnoRoot==0 ){
28c80 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
28c90 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
28ca0 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ID;.    return S
28cb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
28cc0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
28cd0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29  Cur->iPage==(-1)
28ce0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   );.    rc = get
28cf0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75 72  AndInitPage(pCur
28d00 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70  ->pBtree->pBt, p
28d10 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
28d20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c  pCur->apPage[0],
28d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28d40 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 75 72           0, pCur
28d50 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
28d60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
28d70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28d80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
28d90 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
28da0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
28db0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
28dc0 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >iPage = 0;.    
28dd0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
28de0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
28df0 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20  ]->intKey;.  }. 
28e00 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61   pRoot = pCur->a
28e10 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65  pPage[0];.  asse
28e20 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
28e30 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
28e40 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72  );..  /* If pCur
28e50 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f  ->pKeyInfo is no
28e60 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
28e70 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65   caller that ope
28e80 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a  ned this cursor.
28e90 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f    ** expected to
28ea0 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69   open it on an i
28eb0 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68  ndex b-tree. Oth
28ec0 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49  erwise, if pKeyI
28ed0 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c  nfo is.  ** NULL
28ee0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70  , the caller exp
28ef0 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74  ects a table b-t
28f00 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ree. If this is 
28f10 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20  not the case,.  
28f20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
28f30 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
28f40 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  r. .  **.  ** Ea
28f50 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  rlier versions o
28f60 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64  f SQLite assumed
28f70 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20   that this test 
28f80 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20  could not fail. 
28f90 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20   ** if the root 
28fa0 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64 79  page was already
28fb0 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69   loaded when thi
28fc0 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
28fd0 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a  alled (i.e..  **
28fe0 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   if pCur->iPage>
28ff0 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69 73  =0). But this is
29000 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64   not so if the d
29010 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
29020 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75  pted .  ** in su
29030 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70 61  ch a way that pa
29040 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b  ge pRoot is link
29050 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64  ed into a second
29060 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20   b-tree table . 
29070 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65   ** (or the free
29080 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73  list).  */.  ass
29090 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  ert( pRoot->intK
290a0 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e  ey==1 || pRoot->
290b0 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69  intKey==0 );.  i
290c0 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74  f( pRoot->isInit
290d0 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b  ==0 || (pCur->pK
290e0 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f  eyInfo==0)!=pRoo
290f0 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  t->intKey ){.   
29100 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
29110 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
29120 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ..  pCur->aiIdx[
29130 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  0] = 0;.  pCur->
29140 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
29150 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
29160 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
29170 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  t|BTCF_ValidNKey
29180 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
29190 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  ;..  if( pRoot->
291a0 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70  nCell>0 ){.    p
291b0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
291c0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
291d0 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e  lse if( !pRoot->
291e0 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
291f0 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66   subpage;.    if
29200 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31  ( pRoot->pgno!=1
29210 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
29220 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
29230 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
29240 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
29250 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
29260 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
29270 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
29280 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72  SOR_VALID;.    r
29290 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
292a0 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a  pCur, subpage);.
292b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
292c0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
292d0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a  OR_INVALID;.  }.
292e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
292f0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
29300 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
29310 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
29320 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
29330 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
29340 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
29350 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
29360 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
29370 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
29380 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
29390 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
293a0 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
293b0 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
293c0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
293d0 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
293e0 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
293f0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
29400 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
29410 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
29420 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29430 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
29440 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
29450 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
29460 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
29470 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
29480 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
29490 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
294a0 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
294b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
294c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
294d0 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
294e0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
294f0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
29500 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
29510 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29520 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20  Page]));.    rc 
29530 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
29540 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
29550 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29560 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
29570 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
29580 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
29590 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
295a0 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
295b0 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
295c0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
295d0 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
295e0 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
295f0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
29600 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
29610 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
29620 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
29630 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
29640 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
29650 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
29660 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
29670 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
29680 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
29690 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
296a0 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
296b0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
296c0 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
296d0 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
296e0 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
296f0 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
29700 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
29710 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
29720 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
29730 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
29740 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
29750 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
29760 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
29770 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29780 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
29790 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
297a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
297b0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
297c0 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20  hile( !(pPage = 
297d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
297e0 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
297f0 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
29800 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
29810 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
29820 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
29830 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29840 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
29850 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20  ->nCell;.    rc 
29860 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
29870 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
29880 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
29890 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61  c;.  }.  pCur->a
298a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
298b0 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
298c0 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  -1;.  assert( pC
298d0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
298e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
298f0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
29900 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
29910 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
29920 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
29930 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
29940 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
29950 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
29960 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
29970 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
29980 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
29990 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
299a0 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
299b0 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
299c0 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
299d0 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
299e0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
299f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
29a00 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
29a10 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
29a20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
29a30 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
29a40 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
29a50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
29a60 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
29a70 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
29a80 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
29a90 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
29aa0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29ab0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
29ac0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29ad0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
29ae0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
29af0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
29b00 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
29b10 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
29b20 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
29b30 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
29b40 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
29b50 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
29b60 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
29b70 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
29b80 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
29b90 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
29ba0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
29bb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
29bc0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
29bd0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
29be0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
29bf0 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
29c00 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
29c10 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
29c20 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
29c30 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
29c40 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
29c50 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
29c60 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
29c70 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
29c80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
29c90 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
29ca0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
29cb0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
29cc0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29cd0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
29ce0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
29cf0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
29d00 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
29d10 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
29d20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
29d30 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20   already points 
29d40 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
29d50 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  y, this is a no-
29d60 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52  op. */.  if( CUR
29d70 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
29d80 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72  >eState && (pCur
29d90 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
29da0 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a  F_AtLast)!=0 ){.
29db0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
29dc0 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  BUG.    /* This 
29dd0 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20  block serves to 
29de0 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
29df0 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20  e cursor really 
29e00 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20  does point .    
29e10 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ** to the last e
29e20 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72  ntry in the b-tr
29e30 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ee. */.    int i
29e40 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  i;.    for(ii=0;
29e50 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b   ii<pCur->iPage;
29e60 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
29e70 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
29e80 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  x[ii]==pCur->apP
29e90 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29  age[ii]->nCell )
29ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
29eb0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
29ec0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43  pCur->iPage]==pC
29ed0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29ee0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31  >iPage]->nCell-1
29ef0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
29f00 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29f10 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20  r->iPage]->leaf 
29f20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  );.#endif.    re
29f30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29f40 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
29f50 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
29f60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29f70 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52  K ){.    if( CUR
29f80 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
29f90 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
29fa0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
29fb0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
29fc0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29fd0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
29fe0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
29ff0 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
2a000 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
2a010 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2a020 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2a030 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2a040 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
2a050 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
2a060 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2a070 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a080 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
2a090 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61  ags |= BTCF_AtLa
2a0a0 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  st;.      }else{
2a0b0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63  .        pCur->c
2a0c0 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
2a0d0 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d  _AtLast;.      }
2a0e0 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  .   .    }.  }. 
2a0f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2a100 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2a110 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
2a120 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
2a130 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a  near the key .**
2a140 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49   specified by pI
2a150 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e  dxKey or intKey.
2a160 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63     Return a succ
2a170 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
2a180 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
2a190 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61  s, the intKey pa
2a1a0 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
2a1b0 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75    pIdxKey .** mu
2a1c0 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72  st be NULL.  For
2a1d0 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70   index tables, p
2a1e0 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61  IdxKey is used a
2a1f0 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20  nd intKey.** is 
2a200 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
2a210 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68  f an exact match
2a220 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
2a230 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
2a240 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74  s always.** left
2a250 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c   pointing at a l
2a260 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77  eaf page which w
2a270 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e  ould hold the en
2a280 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72  try if it.** wer
2a290 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  e present.  The 
2a2a0 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69  cursor might poi
2a2b0 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74  nt to an entry t
2a2c0 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66  hat comes.** bef
2a2d0 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65  ore or after the
2a2e0 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69   key..**.** An i
2a2f0 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65  nteger is writte
2a300 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69  n into *pRes whi
2a310 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  ch is the result
2a320 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67   of.** comparing
2a330 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
2a340 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
2a350 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a   the cursor is .
2a360 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68  ** pointing.  Th
2a370 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
2a380 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e   integer written
2a390 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69   into.** *pRes i
2a3a0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
2a3b0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
2a3c0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2a3d0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2a3e0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2a3f0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2a400 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
2a410 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
2a420 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  xKey or if the t
2a430 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
2a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a450 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
2a460 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
2a470 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
2a480 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
2a490 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
2a4a0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2a4b0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2a4c0 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
2a4e0 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74  ctly matches int
2a4f0 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
2a500 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20  **     *pRes>0  
2a510 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2a520 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2a530 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2a540 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2a550 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74       is larger t
2a560 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
2a570 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e  ey..**.** For in
2a580 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20  dex tables, the 
2a590 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20  pIdxKey->eqSeen 
2a5a0 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20  field is set to 
2a5b0 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78  1 if there.** ex
2a5c0 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e  ists an entry in
2a5d0 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
2a5e0 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
2a5f0 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e  pIdxKey.  .*/.in
2a600 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
2a610 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
2a620 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2a630 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a640 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
2a650 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
2a660 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
2a670 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
2a680 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
2a690 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
2a6a0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
2a6b0 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
2a6c0 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
2a6d0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
2a6e0 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
2a6f0 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
2a700 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a720 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
2a730 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
2a740 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63  .  int rc;.  Rec
2a750 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f  ordCompare xReco
2a760 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73  rdCompare;..  as
2a770 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2a780 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2a790 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a7a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2a7b0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2a7c0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2a7d0 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
2a7e0 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
2a7f0 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
2a800 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
2a810 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
2a820 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
2a830 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
2a840 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
2a850 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
2a860 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
2a870 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
2a880 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
2a890 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2a8a0 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28  URSOR_VALID && (
2a8b0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2a8c0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
2a8d0 21 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  !=0.   && pCur->
2a8e0 63 75 72 49 6e 74 4b 65 79 20 0a 20 20 29 7b 0a  curIntKey .  ){.
2a8f0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2a900 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
2a910 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2a920 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2a930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2a940 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  }.    if( (pCur-
2a950 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2a960 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20 70  _AtLast)!=0 && p
2a970 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
2a980 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
2a990 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
2a9a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a9b0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
2a9c0 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20  if( pIdxKey ){. 
2a9d0 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
2a9e0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46  e = sqlite3VdbeF
2a9f0 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b  indCompare(pIdxK
2aa00 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  ey);.    pIdxKey
2aa10 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
2aa20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b     assert( pIdxK
2aa30 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2aa40 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  1 .         || p
2aa50 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2aa60 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  rc==0 .         
2aa70 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
2aa80 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29  ult_rc==-1.    )
2aa90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
2aaa0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
2aab0 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61  0; /* All keys a
2aac0 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20  re integers */. 
2aad0 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
2aae0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
2aaf0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2ab00 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2ab10 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2ab20 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2ab30 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2ab40 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
2ab50 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2ab60 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2ab70 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2ab80 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
2ab90 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2aba0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2abb0 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  ID || pCur->apPa
2abc0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2abd0 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66  >nCell>0 );.  if
2abe0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2abf0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
2ac00 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
2ac10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2ac20 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2ac30 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2ac40 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2ac50 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
2ac60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ac70 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2ac80 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
2ac90 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72  ntKey==pCur->cur
2aca0 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  IntKey );.  asse
2acb0 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
2acc0 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
2acd0 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
2ace0 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
2acf0 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
2ad00 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
2ad10 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2ad20 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2ad30 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a  iPage];.    u8 *
2ad40 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
2ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad60 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
2ad70 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
2ad80 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70  age */..    /* p
2ad90 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
2ada0 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
2adb0 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
2adc0 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
2add0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
2ade0 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
2adf0 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
2ae00 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
2ae10 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
2ae20 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
2ae30 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
2ae40 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
2ae50 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
2ae60 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
2ae70 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
2ae80 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
2ae90 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
2aea0 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
2aeb0 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
2aec0 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
2aed0 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
2aee0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
2aef0 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
2af00 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
2af10 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
2af20 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
2af30 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
2af40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2af50 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2af60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2af70 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
2af80 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
2af90 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
2afa0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
2afb0 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52     assert( biasR
2afc0 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52  ight==0 || biasR
2afd0 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69  ight==1 );.    i
2afe0 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61  dx = upr>>(1-bia
2aff0 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20  sRight); /* idx 
2b000 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70  = biasRight ? up
2b010 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  r : (lwr+upr)/2;
2b020 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   */.    pCur->ai
2b030 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2b040 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2b050 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70   if( xRecordComp
2b060 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  are==0 ){.      
2b070 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2b080 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
2b090 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
2b0a0 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70  indCellPastPtr(p
2b0b0 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
2b0c0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2b0d0 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
2b0e0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78         while( 0x
2b0f0 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  80 <= *(pCell++)
2b100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b110 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65  if( pCell>=pPage
2b120 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65 74  ->aDataEnd ) ret
2b130 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2b140 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2b150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2b160 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
2b170 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
2b180 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2b190 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69    if( nCellKey<i
2b1a0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2b1b0 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2b1c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2b1d0 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b  r>upr ){ c = -1;
2b1e0 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2b1f0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
2b200 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey>intKey ){. 
2b210 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2b220 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx-1;.          
2b230 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2b240 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = +1; break; }.
2b250 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2b260 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2b270 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
2b280 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  y );.          p
2b290 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
2b2a0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
2b2b0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2b2c0 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
2b2d0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
2b2e0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2b2f0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2b300 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2b310 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2b320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b330 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20  lwr = idx;.     
2b340 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2b350 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20  to_next_layer;. 
2b360 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2b370 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
2b380 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
2b390 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2b3a0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  K;.            g
2b3b0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2b3c0 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2b3d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b3e0 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72   assert( lwr+upr
2b3f0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
2b400 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e  dx = (lwr+upr)>>
2b410 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77  1;  /* idx = (lw
2b420 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20  r+upr)/2; */.   
2b430 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2b440 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
2b450 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c         int nCell
2b460 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68  ;  /* Size of th
2b470 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20  e pCell cell in 
2b480 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bytes */.       
2b490 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2b4a0 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20  lPastPtr(pPage, 
2b4b0 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  idx);..        /
2b4c0 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75  * The maximum su
2b4d0 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a  pported page-siz
2b4e0 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73  e is 65536 bytes
2b4f0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
2b500 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
2b510 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
2b520 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20  of record bytes 
2b530 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64  stored on an ind
2b540 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  ex B-Tree.      
2b550 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73    ** page is les
2b560 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74  s than 16384 byt
2b570 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74  es and may be st
2b580 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65  ored as a 2-byte
2b590 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69  .        ** vari
2b5a0 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  nt. This informa
2b5b0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2b5c0 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64  attempt to avoid
2b5d0 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20   parsing .      
2b5e0 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20    ** the entire 
2b5f0 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67  cell by checking
2b600 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77   for the cases w
2b610 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20  here the record 
2b620 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  is .        ** s
2b630 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77  tored entirely w
2b640 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
2b650 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74   page by inspect
2b660 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20  ing the first . 
2b670 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65         ** 2 byte
2b680 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20  s of the cell.. 
2b690 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2b6a0 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b    nCell = pCell[
2b6b0 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0];.        if( 
2b6c0 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
2b6d0 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b  x1bytePayload ){
2b6e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2b6f0 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
2b700 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
2b710 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
2b720 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
2b730 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
2b740 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
2b750 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
2b760 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
2b770 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
2b780 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
2b790 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2b7a0 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
2b7b0 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  1==pPage->aDataE
2b7c0 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
2b7d0 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
2b7e0 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
2b7f0 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78  )&pCell[1], pIdx
2b800 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
2b810 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b  lse if( !(pCell[
2b820 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20  1] & 0x80) .    
2b830 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20        && (nCell 
2b840 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c  = ((nCell&0x7f)<
2b850 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c  <7) + pCell[1])<
2b860 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
2b870 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2b880 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
2b890 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  ord-size field i
2b8a0 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e  s a 2 byte varin
2b8b0 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
2b8c0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66   .          ** f
2b8d0 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
2b8e0 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
2b8f0 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2b900 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2b910 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61  ell+nCell+2==pPa
2b920 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2b930 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2b940 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2b950 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2b960 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[2], pIdxKey);.
2b970 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2b980 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2b990 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65  record flows ove
2b9a0 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  r onto one or mo
2b9b0 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
2b9c0 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20  s. In.          
2b9d0 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65  ** this case the
2b9e0 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64   whole cell need
2b9f0 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20  s to be parsed, 
2ba00 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  a buffer allocat
2ba10 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
2ba20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61  and accessPayloa
2ba30 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72  d() used to retr
2ba40 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20  ieve the record 
2ba50 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
2ba60 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66     ** buffer bef
2ba70 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f  ore VdbeRecordCo
2ba80 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63  mpare() can be c
2ba90 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20  alled. .        
2baa0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a    **.          *
2bab0 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
2bac0 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20  is corrupt, the 
2bad0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72  xRecordCompare r
2bae0 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a  outine may read.
2baf0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20            ** up 
2bb00 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70  to two varints p
2bb10 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2bb20 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78  he buffer. An ex
2bb30 74 72 61 20 31 38 20 0a 20 20 20 20 20 20 20 20  tra 18 .        
2bb40 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61    ** bytes of pa
2bb50 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74  dding is allocat
2bb60 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
2bb70 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20   the buffer in. 
2bb80 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
2bb90 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20   this happens.  
2bba0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69  */.          voi
2bbb0 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
2bbc0 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73         u8 * cons
2bbd0 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43  t pCellBody = pC
2bbe0 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69  ell - pPage->chi
2bbf0 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
2bc00 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
2bc10 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
2bc20 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e  ellBody, &pCur->
2bc30 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  info);.         
2bc40 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43   nCell = (int)pC
2bc50 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
2bc60 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2bc70 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20  e( nCell<0 );   
2bc80 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20 73  /* True if key s
2bc90 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d  ize is 2^32 or m
2bca0 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ore */.         
2bcb0 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2bcc0 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c  ==0 );  /* Inval
2bcd0 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78  id key size:  0x
2bce0 38 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a  80 0x80 0x00 */.
2bcf0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2bd00 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20  se( nCell==1 ); 
2bd10 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20   /* Invalid key 
2bd20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30  size:  0x80 0x80
2bd30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20   0x01 */.       
2bd40 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2bd50 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e  ll==2 );  /* Min
2bd60 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78  imum legal index
2bd70 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20   key size */.   
2bd80 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2bd90 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <2 ){.          
2bda0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2bdb0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2bdc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2bdd0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2bde0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bdf0 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
2be00 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
2be10 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20  l+18 );.        
2be20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d    if( pCellKey==
2be30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2be40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2be50 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
2be60 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2be70 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2be80 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2be90 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2bea0 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2beb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63           rc = ac
2bec0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
2bed0 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73  , 0, nCell, (uns
2bee0 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c  igned char*)pCel
2bef0 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20 20  lKey, 2);.      
2bf00 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2bf10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2bf20 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
2bf30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2bf40 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2bf50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2bf60 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2bf70 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2bf80 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
2bf90 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
2bfa0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
2bfb0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
2bfc0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2bfd0 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ( .            (
2bfe0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2bff0 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  !=SQLITE_CORRUPT
2c000 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20   || c==0).      
2c010 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e     && (pIdxKey->
2c020 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
2c030 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70  NOMEM || pCur->p
2c040 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Btree->db->mallo
2c050 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20  cFailed).       
2c060 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2c070 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c<0 ){.         
2c080 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
2c090 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2c0a0 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>0 ){.         
2c0b0 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
2c0c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c0d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
2c0e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2c0f0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2c100 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c110 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2c120 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2c130 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2c140 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69  idx;.          i
2c150 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43  f( pIdxKey->errC
2c160 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ode ) rc = SQLIT
2c170 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  E_CORRUPT;.     
2c180 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2c190 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2c1a0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c   }.        if( l
2c1b0 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b 0a  wr>upr ) break;.
2c1c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c1d0 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20  lwr+upr>=0 );.  
2c1e0 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72        idx = (lwr
2c1f0 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64  +upr)>>1;  /* id
2c200 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 20  x = (lwr+upr)/2 
2c210 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
2c220 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
2c230 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67  ==upr+1 || (pPag
2c240 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
2c250 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20  age->leaf) );.  
2c260 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2c270 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
2c280 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2c290 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2c2a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2c2b0 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
2c2c0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2c2d0 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
2c2e0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2c2f0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2c300 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70  16)idx;.      *p
2c310 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
2c320 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c330 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2c340 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d  _finish;.    }.m
2c350 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72  oveto_next_layer
2c360 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70  :.    if( lwr>=p
2c370 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
2c380 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
2c390 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2c3a0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2c3b0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
2c3c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
2c3d0 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
2c3e0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
2c3f0 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r));.    }.    p
2c400 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2c410 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c  >iPage] = (u16)l
2c420 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  wr;.    rc = mov
2c430 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
2c440 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
2c450 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  rc ) break;.  }.
2c460 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
2c470 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2c480 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2c490 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2c4a0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2c4b0 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72  _ValidOvfl);.  r
2c4c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2c4d0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2c4e0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2c4f0 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
2c500 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
2c510 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
2c520 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
2c530 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
2c540 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
2c550 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
2c560 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
2c570 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2c580 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
2c590 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
2c5a0 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
2c5b0 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
2c5c0 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
2c5d0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2c5e0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2c5f0 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
2c600 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
2c610 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
2c620 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
2c630 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2c640 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
2c650 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
2c660 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
2c670 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
2c680 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
2c690 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
2c6a0 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
2c6b0 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
2c6c0 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
2c6d0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
2c6e0 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
2c6f0 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
2c700 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
2c710 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
2c720 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
2c730 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
2c740 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
2c750 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
2c760 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
2c770 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
2c780 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
2c790 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
2c7a0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
2c7b0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
2c7c0 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
2c7d0 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a  set *pRes=1..**.
2c7e0 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
2c7f0 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
2c800 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20  e3BtreeNext().  
2c810 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
2c820 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
2c830 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2c840 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65   of merely incre
2c850 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
2c860 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
2c870 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
2c880 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74  e next cell on t
2c890 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
2c8a0 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
2c8b0 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65  treeNext() helpe
2c8c0 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  r.** routine is 
2c8d0 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
2c8e0 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
2c8f0 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
2c900 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f  nt page or.** to
2c910 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
2c920 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  sor..**.** The c
2c930 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2c940 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74  will set *pRes t
2c950 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69  o 0 or 1.  The i
2c960 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
2c970 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20  ue.** will be 1 
2c980 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65  if the cursor be
2c990 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72  ing stepped corr
2c9a0 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
2c9b0 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69  L index and.** i
2c9c0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  f this routine c
2c9d0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73  ould have been s
2c9e0 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53  kipped if that S
2c9f0 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
2ca00 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e  n.** a unique in
2ca10 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20  dex.  Otherwise 
2ca20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
2ca30 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74  have set *pRes t
2ca40 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20  o zero..** Zero 
2ca50 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  is the common ca
2ca60 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d  se. The btree im
2ca70 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  plementation is 
2ca80 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a  free to use the.
2ca90 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73  ** initial *pRes
2caa0 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74   value as a hint
2cab0 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66   to improve perf
2cac0 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65  ormance, but the
2cad0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69   current.** SQLi
2cae0 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  te btree impleme
2caf0 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  ntation does not
2cb00 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65  . (Note that the
2cb10 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a   comdb2 btree.**
2cb20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2cb30 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69  does use this hi
2cb40 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f  nt, however.).*/
2cb50 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
2cb60 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65  OINLINE int btre
2cb70 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
2cb80 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2cb90 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
2cba0 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
2cbb0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2cbc0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2cbd0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2cbe0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2cbf0 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2cc00 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2cc10 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2cc20 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b  ert( *pRes==0 );
2cc30 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2cc40 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2cc50 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
2cc60 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2cc70 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
2cc80 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  l)==0 );.    rc 
2cc90 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
2cca0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
2ccb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2ccc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2ccd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2cce0 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
2ccf0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2cd00 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ate ){.      *pR
2cd10 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  es = 1;.      re
2cd20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2cd30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
2cd40 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
2cd50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2cd60 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2cd70 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2cd80 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2cd90 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
2cda0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2cdb0 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2cdc0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2cdd0 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20  skipNext>0 ){.  
2cde0 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2cdf0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
2ce00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ce10 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2ce20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2ce30 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2ce40 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2ce50 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2ce60 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  age];.  idx = ++
2ce70 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2ce80 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
2ce90 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2cea0 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t );..  /* If th
2ceb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2cec0 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69  is corrupt, it i
2ced0 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  s possible for t
2cee0 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20  he value of idx 
2cef0 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61  .  ** to be inva
2cf00 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63  lid here. This c
2cf10 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66  an only occur if
2cf20 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72   a second cursor
2cf30 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74   modifies.  ** t
2cf40 68 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75  he page while cu
2cf50 72 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c  rsor pCur is hol
2cf60 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
2cf70 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61   to it. Which ca
2cf80 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70  n.  ** only happ
2cf90 65 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61  en if the databa
2cfa0 73 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e  se is corrupt in
2cfb0 20 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74   such a way as t
2cfc0 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20  o link the.  ** 
2cfd0 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74  page into more t
2cfe0 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
2cff0 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74  tructure. */.  t
2d000 65 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61  estcase( idx>pPa
2d010 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
2d020 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
2d030 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
2d040 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2d050 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
2d060 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
2d070 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2d080 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2d090 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
2d0a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2d0b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  n rc;.      retu
2d0c0 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2d0d0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
2d0e0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
2d0f0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2d100 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
2d110 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
2d120 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2d130 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2d140 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d150 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2d160 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
2d170 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
2d180 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2d190 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2d1a0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
2d1b0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2d1c0 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e  iPage]>=pPage->n
2d1d0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  Cell );.    if( 
2d1e0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2d1f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
2d200 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
2d210 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
2d220 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
2d230 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d240 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2d250 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2d260 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d270 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2d280 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2d290 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2d2a0 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  }.}.int sqlite3B
2d2b0 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2d2c0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2d2d0 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  es){.  MemPage *
2d2e0 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
2d2f0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2d300 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2d310 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
2d320 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
2d330 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29  =0 || *pRes==1 )
2d340 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2d350 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2d360 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2d370 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2d380 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2d390 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2d3a0 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2d3b0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2d3c0 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a  _ValidOvfl);.  *
2d3d0 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRes = 0;.  if( 
2d3e0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2d3f0 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74  RSOR_VALID ) ret
2d400 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
2d410 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50 61  ur, pRes);.  pPa
2d420 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2d430 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2d440 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61    if( (++pCur->a
2d450 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2d460 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ])>=pPage->nCell
2d470 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   ){.    pCur->ai
2d480 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2d490 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62  --;.    return b
2d4a0 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
2d4b0 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Res);.  }.  if( 
2d4c0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2d4d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d4e0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2d4f0 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
2d500 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2d510 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70   }.}../*.** Step
2d520 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2d530 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
2d540 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
2d550 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
2d560 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
2d570 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2d580 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
2d590 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
2d5a0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
2d5b0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
2d5c0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
2d5d0 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
2d5e0 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
2d5f0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
2d600 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
2d610 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20   entry point is 
2d620 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2d630 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f  ious().  That ro
2d640 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
2d650 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
2d660 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
2d670 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67  ely decrementing
2d680 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
2d690 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
2d6a0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69  .** to the previ
2d6b0 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ous cell on the 
2d6c0 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
2d6d0 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
2d6e0 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68  ePrevious().** h
2d6f0 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73  elper routine is
2d700 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
2d710 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
2d720 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
2d730 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74  ent page.** or t
2d740 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
2d750 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rsor..**.** The 
2d760 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2d770 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20   will set *pRes 
2d780 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20  to 0 or 1.  The 
2d790 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
2d7a0 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31  lue.** will be 1
2d7b0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62   if the cursor b
2d7c0 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72  eing stepped cor
2d7d0 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53  responds to an S
2d7e0 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20  QL index and.** 
2d7f0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
2d800 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
2d810 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20  skipped if that 
2d820 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
2d830 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69  en.** a unique i
2d840 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65  ndex.  Otherwise
2d850 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
2d860 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20   have set *pRes 
2d870 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f  to zero..** Zero
2d880 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   is the common c
2d890 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69  ase. The btree i
2d8a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
2d8b0 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65   free to use the
2d8c0 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  .** initial *pRe
2d8d0 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e  s value as a hin
2d8e0 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72  t to improve per
2d8f0 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68  formance, but th
2d900 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c  e current.** SQL
2d910 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
2d920 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
2d930 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68  t. (Note that th
2d940 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a  e comdb2 btree.*
2d950 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
2d960 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68   does use this h
2d970 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a  int, however.).*
2d980 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
2d990 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
2d9a0 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
2d9b0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2d9c0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
2d9d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2d9e0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2d9f0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2da00 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2da10 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
2da20 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2da30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2da40 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2da50 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2da60 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2da70 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2da80 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
2da90 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
2daa0 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
2dab0 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20  idNKey))==0 );. 
2dac0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2dad0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2dae0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2daf0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2db00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   ){.    rc = res
2db10 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
2db20 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
2db30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2db40 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2db50 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
2db60 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2db70 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
2db80 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
2db90 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
2dba0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2dbb0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
2dbc0 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
2dbd0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2dbe0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2dbf0 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
2dc00 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
2dc10 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
2dc20 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2dc30 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
2dc40 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2dc50 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ext<0 ){.       
2dc60 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2dc70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
2dc80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2dc90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
2dca0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2dcb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
2dcc0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2dcd0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2dce0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2dcf0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
2dd00 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2dd10 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
2dd20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2dd30 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63  ->iPage];.    rc
2dd40 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2dd50 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
2dd60 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
2dd70 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
2dd80 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2dd90 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
2dda0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
2ddb0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
2ddc0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2ddd0 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b  ur->iPage]==0 ){
2dde0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2ddf0 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
2de00 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2de10 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2de20 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
2de30 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
2de40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2de50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
2de60 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
2de70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
2de80 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2de90 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nSize==0 );.    
2dea0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2deb0 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
2dec0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2ded0 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b  alidOvfl))==0 );
2dee0 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
2def0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
2df00 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
2df10 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2df20 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
2df30 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
2df40 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
2df50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2df60 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2df70 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
2df80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2df90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2dfa0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2dfb0 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
2dfc0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2dfd0 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
2dfe0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
2dff0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2e000 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2e010 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
2e020 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2e030 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52   *pRes==0 || *pR
2e040 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  es==1 );.  asser
2e050 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2e060 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
2e070 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2e080 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20  ID );.  *pRes = 
2e090 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
2e0a0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
2e0b0 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
2e0c0 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
2e0d0 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ey);.  pCur->inf
2e0e0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69  o.nSize = 0;.  i
2e0f0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2e100 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20  =CURSOR_VALID.  
2e110 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b   || pCur->aiIdx[
2e120 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a  pCur->iPage]==0.
2e130 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61     || pCur->apPa
2e140 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2e150 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20  >leaf==0.  ){.  
2e160 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72    return btreePr
2e170 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
2e180 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  s);.  }.  pCur->
2e190 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2e1a0 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53  e]--;.  return S
2e1b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2e1c0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
2e1d0 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
2e1e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2e1f0 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
2e200 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
2e210 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
2e220 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
2e230 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
2e240 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2e250 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
2e260 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
2e270 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
2e280 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
2e290 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
2e2a0 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
2e2b0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
2e2c0 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
2e2d0 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
2e2e0 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
2e2f0 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
2e300 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2e310 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
2e320 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
2e330 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
2e340 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
2e350 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73  ror.  *ppPage is
2e360 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20   set to NULL in 
2e370 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
2e380 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
2e390 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
2e3a0 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
2e3b0 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20   then an effort 
2e3c0 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
2e3d0 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
2e3e0 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
2e3f0 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
2e400 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
2e410 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
2e420 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
2e430 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
2e440 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
2e450 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e460 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
2e470 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
2e480 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
2e490 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
2e4a0 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  e eMode paramete
2e4b0 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41  r is BTALLOC_EXA
2e4c0 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62  CT and the nearb
2e4d0 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a  y page exists.**
2e4e0 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
2e4f0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
2e500 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2e510 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
2e520 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69  .  If.** eMode i
2e530 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65  s BTALLOC_LT the
2e540 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72  n the page retur
2e550 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73  ned will be less
2e560 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
2e570 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61  * to nearby if a
2e580 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69  ny such page exi
2e590 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69  sts.  If eMode i
2e5a0 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68  s BTALLOC_ANY th
2e5b0 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  en there.** are 
2e5c0 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  no restrictions 
2e5d0 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73  on which page is
2e5e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2e5f0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
2e600 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
2e610 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
2e620 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
2e630 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
2e640 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a  *ppPage,      /*
2e650 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74   Store pointer t
2e660 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
2e670 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50  page here */.  P
2e680 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20  gno *pPgno,     
2e690 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
2e6a0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68  he page number h
2e6b0 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  ere */.  Pgno ne
2e6c0 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20  arby,           
2e6d0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  /* Search for a 
2e6e0 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f  page near this o
2e6f0 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65  ne */.  u8 eMode
2e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e710 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c  * BTALLOC_EXACT,
2e720 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20   BTALLOC_LT, or 
2e730 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29  BTALLOC_ANY */.)
2e740 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2e750 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
2e760 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
2e770 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
2e780 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
2e790 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
2e7a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
2e7b0 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
2e7c0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
2e7d0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
2e7e0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
2e7f0 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
2e800 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
2e810 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
2e820 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2e830 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
2e840 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e850 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2e860 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2e870 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  ert( eMode==BTAL
2e880 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72  LOC_ANY || (near
2e890 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69  by>0 && IfNotOmi
2e8a0 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  tAV(pBt->autoVac
2e8b0 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65  uum)) );.  pPage
2e8c0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
2e8d0 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65  .  mxPage = btre
2e8e0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
2e8f0 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
2e900 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37  F: R-05119-02637
2e910 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d   The 4-byte big-
2e920 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61  endian integer a
2e930 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a  t offset 36.  **
2e940 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74   stores stores t
2e950 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
2e960 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
2e970 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e  freelist. */.  n
2e980 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2e990 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
2e9a0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
2e9b0 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66  mxPage-1 );.  if
2e9c0 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20  ( n>=mxPage ){. 
2e9d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2e9e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2e9f0 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a   }.  if( n>0 ){.
2ea00 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
2ea10 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
2ea20 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f  eelist.  Reuse o
2ea30 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
2ea40 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  s. */.    Pgno i
2ea50 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65  Trunk;.    u8 se
2ea60 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
2ea70 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
2ea80 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
2ea90 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
2eaa0 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72  */.    u32 nSear
2eab0 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75  ch = 0;   /* Cou
2eac0 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
2ead0 20 6f 66 20 73 65 61 72 63 68 20 61 74 74 65 6d   of search attem
2eae0 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  pts */.    .    
2eaf0 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41  /* If eMode==BTA
2eb00 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61  LLOC_EXACT and a
2eb10 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f   query of the po
2eb20 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a  inter-map.    **
2eb30 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20   shows that the 
2eb40 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
2eb50 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68   somewhere on th
2eb60 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
2eb70 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74  n.    ** the ent
2eb80 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ire-list will be
2eb90 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
2eba0 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  at page..    */.
2ebb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2ebc0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2ebd0 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54     if( eMode==BT
2ebe0 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20  ALLOC_EXACT ){. 
2ebf0 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c       if( nearby<
2ec00 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  =mxPage ){.     
2ec10 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
2ec20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61       assert( nea
2ec30 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  rby>0 );.       
2ec40 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
2ec50 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
2ec60 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
2ec70 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
2ec80 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
2ec90 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2eca0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2ecb0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
2ecc0 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
2ecd0 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
2ece0 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  st = 1;.        
2ecf0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
2ed00 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42  lse if( eMode==B
2ed10 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
2ed20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2ed30 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
2ed40 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
2ed50 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  t the free-list 
2ed60 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20  count by 1. Set 
2ed70 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e  iTrunk to the in
2ed80 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  dex of the.    *
2ed90 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73  * first free-lis
2eda0 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50  t trunk page. iP
2edb0 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74  revTrunk is init
2edc0 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a  ially 1..    */.
2edd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ede0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2edf0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
2ee00 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2ee10 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74   rc;.    put4byt
2ee20 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2ee30 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20  [36], n-1);..   
2ee40 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74   /* The code wit
2ee50 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  hin this loop is
2ee60 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69   run only once i
2ee70 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73  f the 'searchLis
2ee80 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  t' variable.    
2ee90 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20  ** is not true. 
2eea0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75  Otherwise, it ru
2eeb0 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
2eec0 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74   trunk-page on t
2eed0 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c  he.    ** free-l
2eee0 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61  ist until the pa
2eef0 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  ge 'nearby' is l
2ef00 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
2ef10 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20  TALLOC_EXACT).  
2ef20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20    ** or until a 
2ef30 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27  page less than '
2ef40 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
2ef50 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
2ef60 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20  OC_LT).    */.  
2ef70 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72    do {.      pPr
2ef80 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b  evTrunk = pTrunk
2ef90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
2efa0 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
2efb0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
2efc0 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20  : R-01506-11053 
2efd0 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65  The first intege
2efe0 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20  r on a freelist 
2eff0 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20  trunk page.     
2f000 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67     ** is the pag
2f010 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2f020 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74 72  next freelist tr
2f030 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2f040 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20  list or.        
2f050 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20  ** zero if this 
2f060 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65 65  is the last free
2f070 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
2f080 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75   */.        iTru
2f090 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2f0a0 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
2f0b0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
2f0c0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  e{.        /* EV
2f0d0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38  IDENCE-OF: R-598
2f0e0 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62  41-13798 The 4-b
2f0f0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
2f100 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
2f110 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   32.        ** s
2f120 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20 6e  tores the page n
2f130 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
2f140 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
2f150 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f  reelist, or zero
2f160 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   if.        ** t
2f170 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
2f180 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  mpty. */.       
2f190 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
2f1a0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2f1b0 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  a[32]);.      }.
2f1c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2f1d0 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29  iTrunk==mxPage )
2f1e0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75  ;.      if( iTru
2f1f0 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65  nk>mxPage || nSe
2f200 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20  arch++ > n ){.  
2f210 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2f220 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2f230 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f240 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
2f250 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
2f260 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
2f270 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  k, 0);.      }. 
2f280 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2f290 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
2f2a0 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
2f2b0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2f2c0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
2f2d0 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21   assert( pTrunk!
2f2e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
2f2f0 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  rt( pTrunk->aDat
2f300 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a  a!=0 );.      /*
2f310 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2f320 31 33 35 32 33 2d 30 34 33 39 34 20 54 68 65 20  13523-04394 The 
2f330 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f  second integer o
2f340 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75  n a freelist tru
2f350 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  nk page.      **
2f360 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2f370 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e  f leaf page poin
2f380 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20  ters to follow. 
2f390 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74  */.      k = get
2f3a0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2f3b0 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20  Data[4]);.      
2f3c0 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61  if( k==0 && !sea
2f3d0 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  rchList ){.     
2f3e0 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
2f3f0 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e  has no leaves an
2f400 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f  d the list is no
2f410 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  t being searched
2f420 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  . .        ** So
2f430 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75   extract the tru
2f440 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61  nk page itself a
2f450 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65  nd use it as the
2f460 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20   newly .        
2f470 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ** allocated pag
2f480 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
2f490 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d  ert( pPrevTrunk=
2f4a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
2f4b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2f4c0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
2f4d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2f4e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2f4f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2f500 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2f510 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50     }.        *pP
2f520 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
2f530 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
2f540 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
2f550 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2f560 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2f570 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
2f580 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  ;.        pTrunk
2f590 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
2f5a0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2f5b0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
2f5c0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
2f5d0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
2f5e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2f5f0 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73   k>(u32)(pBt->us
2f600 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20  ableSize/4 - 2) 
2f610 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
2f620 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20  lue of k is out 
2f630 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62  of range.  Datab
2f640 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  ase corruption *
2f650 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
2f660 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2f670 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  PT;.        goto
2f680 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2f690 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ge;.#ifndef SQLI
2f6a0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2f6b0 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  UM.      }else i
2f6c0 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20  f( searchList . 
2f6d0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e             && (n
2f6e0 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c  earby==iTrunk ||
2f6f0 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20   (iTrunk<nearby 
2f700 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
2f710 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b  C_LE)) .      ){
2f720 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2f730 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
2f740 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
2f750 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
2f760 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
2f770 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
2f780 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2f790 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
2f7a0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
2f7b0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
2f7c0 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
2f7d0 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
2f7e0 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  ;.        search
2f7f0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
2f800 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2f810 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
2f820 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2f830 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2f840 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2f850 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2f860 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f870 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20   if( k==0 ){.   
2f880 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
2f890 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
2f8a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
2f8b0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
2f8c0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2f8d0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2f8e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f8f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f900 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
2f910 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
2f920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2f930 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2f950 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2f960 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2f970 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2f980 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76     memcpy(&pPrev
2f990 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2f9a0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2f9b0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2f9c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2f9d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
2f9e0 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  The trunk page i
2f9f0 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
2fa00 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20  e caller but it 
2fa10 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20  contains .      
2fa20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20      ** pointers 
2fa30 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  to free-list lea
2fa40 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c  ves. The first l
2fa50 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72  eaf becomes a tr
2fa60 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unk.          **
2fa70 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
2fa80 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
2fa90 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61  .          MemPa
2faa0 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20  ge *pNewTrunk;. 
2fab0 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e           Pgno iN
2fac0 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79  ewTrunk = get4by
2fad0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
2fae0 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  a[8]);.         
2faf0 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d   if( iNewTrunk>m
2fb00 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20  xPage ){ .      
2fb10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2fb20 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2fb30 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2fb40 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2fb50 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
2fb60 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2fb70 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d  se( iNewTrunk==m
2fb80 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
2fb90 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
2fba0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
2fbb0 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
2fbc0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
2fbd0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2fbe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fbf0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2fc00 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2fc10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fc20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fc30 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54  PagerWrite(pNewT
2fc40 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2fc50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2fc60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2fc70 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
2fc80 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
2fc90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
2fca0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2fcb0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
2fcc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
2fcd0 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
2fce0 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
2fcf0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
2fd00 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
2fd10 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
2fd20 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
2fd30 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2fd40 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
2fd50 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
2fd60 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
2fd70 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  *4);.          r
2fd80 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
2fd90 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
2fda0 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
2fdb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fdc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2fdd0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2fde0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2fdf0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2fe00 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2fe10 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
2fe20 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
2fe30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2fe40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2fe50 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
2fe60 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
2fe70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2fe80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2fe90 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2fea0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2feb0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2fec0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2fed0 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
2fee0 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75  Data[0], iNewTru
2fef0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
2ff00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ff10 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
2ff20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
2ff30 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
2ff40 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
2ff50 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
2ff60 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66  o, n-1));.#endif
2ff70 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2ff80 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   k>0 ){.        
2ff90 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61  /* Extract a lea
2ffa0 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b  f from the trunk
2ffb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
2ffc0 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20  closest;.       
2ffd0 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20   Pgno iPage;.   
2ffe0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
2fff0 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75  ar *aData = pTru
30000 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  nk->aData;.     
30010 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20     if( nearby>0 
30020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
30030 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c   i;.          cl
30040 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
30050 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d       if( eMode==
30060 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
30070 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
30080 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
30090 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67              iPag
300a0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
300b0 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20  ata[8+i*4]);.   
300c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
300d0 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a  Page<=nearby ){.
300e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
300f0 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
30100 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
30110 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
30120 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
30130 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
30140 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
30150 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
30160 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69       dist = sqli
30170 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
30180 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
30190 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
301a0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20         for(i=1; 
301b0 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
301c0 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20           int d2 
301d0 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
301e0 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
301f0 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72  a[8+i*4]) - near
30200 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
30210 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
30220 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
30230 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
30240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
30250 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20  ist = d2;.      
30260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30280 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
30290 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  e{.          clo
302a0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
302b0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61    }..        iPa
302c0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
302d0 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
302e0 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
302f0 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
30300 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
30310 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20  f( iPage>mxPage 
30320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
30330 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
30340 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
30350 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
30360 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
30370 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
30380 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
30390 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
303a0 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20  ( !searchList . 
303b0 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67          || (iPag
303c0 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50  e==nearby || (iP
303d0 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  age<nearby && eM
303e0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
303f0 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ) .        ){.  
30400 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f          int noCo
30410 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20  ntent;.         
30420 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b   *pPgno = iPage;
30430 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
30440 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
30450 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25  was leaf %d of %
30460 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20  d on trunk %d". 
30470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30480 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20  ": %d more free 
30490 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
304a0 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e             *pPgn
304b0 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c  o, closest+1, k,
304c0 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e   pTrunk->pgno, n
304d0 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
304e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
304f0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
30500 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
30510 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
30520 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
30530 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ge;.          if
30540 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
30550 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
30560 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
30570 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
30580 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
30590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
305a0 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
305b0 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
305c0 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20        noContent 
305d0 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f  = !btreeGetHasCo
305e0 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e  ntent(pBt, *pPgn
305f0 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  o)? PAGER_GET_NO
30600 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20  CONTENT : 0;.   
30610 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
30620 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
30630 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
30640 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
30650 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
30660 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30670 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
30680 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30690 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
306a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
306b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
306c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
306d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
306e0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
306f0 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67            *ppPag
30700 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
30710 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
30720 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
30730 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
30740 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
30750 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30760 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
30770 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
30780 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
30790 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
307a0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
307b0 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
307c0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
307d0 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20  so append a new 
307e0 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20  page to the.    
307f0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
30800 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
30810 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70   Normally, new p
30820 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ages allocated b
30830 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e  y this block can
30840 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72   be requested fr
30850 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  om the.    ** pa
30860 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
30870 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
30880 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70  flag set. This p
30890 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65  revents the page
308a0 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72  r.    ** from tr
308b0 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65  ying to read the
308c0 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66   pages content f
308d0 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65  rom disk. Howeve
308e0 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  r, if the.    **
308f0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
30900 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
30910 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   run one or more
30920 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
30930 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73  uum.    ** steps
30940 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
30950 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20  we are about to 
30960 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e  allocate may con
30970 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20  tain content.   
30980 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75   ** that is requ
30990 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ired in the even
309a0 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
309b0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64   In this case, d
309c0 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74  o.    ** not set
309d0 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
309e0 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65  flag. This cause
309f0 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c  s the pager to l
30a00 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a  oad and journal.
30a10 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
30a20 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
30a30 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69  before overwriti
30a40 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  ng it..    **.  
30a50 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
30a60 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f  he pager will no
30a70 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d  t actually attem
30a80 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f  pt to load or jo
30a90 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f  urnal .    ** co
30aa0 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61  ntent for any pa
30ab0 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64  ge that really d
30ac0 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65  oes lie past the
30ad0 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
30ae0 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
30af0 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65   on disk. So the
30b00 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61   effects of disa
30b10 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e  bling the no-con
30b20 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tent optimizatio
30b30 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72  n.    ** here ar
30b40 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68  e confined to th
30b50 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c  ose pages that l
30b60 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65  ie between the e
30b70 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
30b80 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
30b90 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74  and the end of t
30ba0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30bb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
30bc0 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30   bNoContent = (0
30bd0 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  ==IfNotOmitAV(pB
30be0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29  t->bDoTruncate))
30bf0 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ? PAGER_GET_NOCO
30c00 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63  NTENT:0;..    rc
30c10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
30c20 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
30c30 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
30c40 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
30c50 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61  rc;.    pBt->nPa
30c60 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42  ge++;.    if( pB
30c70 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e  t->nPage==PENDIN
30c80 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
30c90 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b   ) pBt->nPage++;
30ca0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
30cb0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
30cc0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
30cd0 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d  toVacuum && PTRM
30ce0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
30cf0 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20  Bt->nPage) ){.  
30d00 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
30d10 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
30d20 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
30d30 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
30d40 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
30d50 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
30d60 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
30d70 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
30d80 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
30d90 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
30da0 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
30db0 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
30dc0 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
30dd0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
30de0 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
30df0 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20   *pPg = 0;.     
30e00 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
30e10 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
30e20 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d  f file (pointer-
30e30 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42  map page)\n", pB
30e40 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20  t->nPage));.    
30e50 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
30e60 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Page!=PENDING_BY
30e70 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
30e80 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
30e90 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
30ea0 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26  t, pBt->nPage, &
30eb0 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  pPg, bNoContent)
30ec0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
30ed0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30ee0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30ef0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d  3PagerWrite(pPg-
30f00 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
30f10 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30f20 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
30f30 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
30f40 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74  rn rc;.      pBt
30f50 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20  ->nPage++;.     
30f60 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
30f70 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
30f80 47 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e  GE(pBt) ){ pBt->
30f90 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d  nPage++; }.    }
30fa0 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34  .#endif.    put4
30fb0 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70  byte(28 + (u8*)p
30fc0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
30fd0 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  a, pBt->nPage);.
30fe0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74      *pPgno = pBt
30ff0 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73  ->nPage;..    as
31000 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
31010 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
31020 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  pBt) );.    rc =
31030 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
31040 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
31050 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74   ppPage, bNoCont
31060 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ent);.    if( rc
31070 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
31080 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31090 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
310a0 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
310b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
310c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
310d0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
310e0 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  );.      *ppPage
310f0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
31100 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
31110 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
31120 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
31130 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
31140 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
31150 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
31160 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
31170 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
31180 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
31190 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
311a0 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73  revTrunk);.  ass
311b0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
311c0 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  OK || sqlite3Pag
311d0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28  erPageRefcount((
311e0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
311f0 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  e)<=1 );.  asser
31200 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
31210 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69   || (*ppPage)->i
31220 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65  sInit==0 );.  re
31230 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
31240 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
31250 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70  is used to add p
31260 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65  age iPage to the
31270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
31280 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74  ree-list. .** It
31290 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
312a0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
312b0 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20   already a part 
312c0 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  of the free-list
312d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
312e0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
312f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
31300 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
31310 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a   is optional..**
31320 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68   If the caller h
31330 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61  appens to have a
31340 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
31350 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a  MemPage object .
31360 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
31370 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68   to page iPage h
31380 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73  andy, it may pas
31390 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f  s it as the seco
313a0 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74  nd value. .** Ot
313b0 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20  herwise, it may 
313c0 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  pass NULL..**.**
313d0 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   If a pointer to
313e0 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63   a MemPage objec
313f0 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  t is passed as t
31400 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
31410 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72  nt,.** its refer
31420 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f  ence count is no
31430 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69  t altered by thi
31440 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
31450 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
31460 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42  ge2(BtShared *pB
31470 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d  t, MemPage *pMem
31480 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65  Page, Pgno iPage
31490 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
314a0 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
314b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65           /* Free
314c0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
314d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e   */.  Pgno iTrun
314e0 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
314f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
31500 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
31510 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
31520 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a   */ .  MemPage *
31530 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
31540 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  age1;      /* Lo
31550 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f  cal reference to
31560 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d   page 1 */.  Mem
31570 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
31580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31590 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66   /* Page being f
315a0 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c  reed. May be NUL
315b0 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  L. */.  int rc; 
315c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
315e0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
315f0 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
31600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31610 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
31620 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
31630 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  n free-list */..
31640 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
31650 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
31660 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
31670 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
31680 20 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a 20   || iPage>1 );. 
31690 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61   assert( !pMemPa
316a0 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e  ge || pMemPage->
316b0 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a  pgno==iPage );..
316c0 20 20 69 66 28 20 69 50 61 67 65 3c 32 20 29 20    if( iPage<2 ) 
316d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
316e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66  RRUPT_BKPT;.  if
316f0 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20  ( pMemPage ){.  
31700 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61    pPage = pMemPa
31710 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ge;.    sqlite3P
31720 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70  agerRef(pPage->p
31730 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  DbPage);.  }else
31740 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74  {.    pPage = bt
31750 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
31760 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  t, iPage);.  }..
31770 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
31780 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
31790 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
317a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
317b0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
317c0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
317d0 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
317e0 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65  age_out;.  nFree
317f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
31800 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
31810 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
31820 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
31830 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28  nFree+1);..  if(
31840 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
31850 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
31860 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  TE ){.    /* If 
31870 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
31880 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  e option is enab
31890 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  led, then.    **
318a0 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76   always fully ov
318b0 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
318c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
318d0 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20   zeros..    */. 
318e0 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26     if( (!pPage &
318f0 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65  & ((rc = btreeGe
31900 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
31910 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30  , &pPage, 0))!=0
31920 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20  ) ).     ||     
31930 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71         ((rc = sq
31940 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31950 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
31960 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
31970 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
31980 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  out;.    }.    m
31990 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
319a0 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42  ta, 0, pPage->pB
319b0 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
319c0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
319d0 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
319e0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72   auto-vacuum, wr
319f0 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  ite an entry in 
31a00 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
31a10 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
31a20 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
31a30 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69  s free..  */.  i
31a40 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
31a50 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ){.    ptrmapPut
31a60 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52  (pBt, iPage, PTR
31a70 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
31a80 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
31a90 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
31aa0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
31ab0 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20   Now manipulate 
31ac0 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62  the actual datab
31ad0 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74  ase free-list st
31ae0 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61  ructure. There a
31af0 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73  re two.  ** poss
31b00 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68  ibilities. If th
31b10 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63  e free-list is c
31b20 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20  urrently empty, 
31b30 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  or if the first.
31b40 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
31b50 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
31b60 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74   is full, then t
31b70 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
31b80 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20  come a.  ** new 
31b90 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
31ba0 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
31bb0 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   it will become 
31bc0 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20  a leaf of the.  
31bd0 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ** first trunk p
31be0 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  age in the curre
31bf0 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  nt free-list. Th
31c00 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69  is block tests i
31c10 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  f it.  ** is pos
31c20 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
31c30 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66   page as a new f
31c40 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20  ree-list leaf.. 
31c50 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21   */.  if( nFree!
31c60 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c  =0 ){.    u32 nL
31c70 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
31c80 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
31c90 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65  umber of leaf ce
31ca0 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  lls on trunk pag
31cb0 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b  e */..    iTrunk
31cc0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
31cd0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
31ce0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
31cf0 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
31d00 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
31d10 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
31d20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31d30 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
31d40 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c  t;.    }..    nL
31d50 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26  eaf = get4byte(&
31d60 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
31d70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
31d80 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33  Bt->usableSize>3
31d90 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65  2 );.    if( nLe
31da0 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75  af > (u32)pBt->u
31db0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
31dc0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
31dd0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
31de0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  T;.      goto fr
31df0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
31e00 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  }.    if( nLeaf 
31e10 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  < (u32)pBt->usab
31e20 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
31e30 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
31e40 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72   case there is r
31e50 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  oom on the trunk
31e60 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20   page to insert 
31e70 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
31e80 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  * being freed as
31e90 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20   a new leaf..   
31ea0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
31eb0 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75  ote that the tru
31ec0 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72  nk page is not r
31ed0 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c  eally full until
31ee0 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20   it contains.   
31ef0 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
31f00 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20  /4 - 2 entries, 
31f10 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34  not usableSize/4
31f20 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20   - 8 entries as 
31f30 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  we have.      **
31f40 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65   coded.  But due
31f50 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
31f60 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f  or in versions o
31f70 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
31f80 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30  o.      ** 3.6.0
31f90 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  , databases with
31fa0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
31fb0 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f  pages holding mo
31fc0 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  re than.      **
31fd0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
31fe0 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62  8 entries will b
31ff0 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f  e reported as co
32000 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72  rrupt.  In order
32010 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69  .      ** to mai
32020 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20  ntain backwards 
32030 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
32040 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  th older version
32050 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20  s of SQLite,.   
32060 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f     ** we will co
32070 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69  ntinue to restri
32080 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
32090 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
320a0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
320b0 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
320c0 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
320d0 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
320e0 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
320f0 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
32100 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
32110 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
32120 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
32130 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
32140 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
32150 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
32160 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
32170 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
32180 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  "..      **.    
32190 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
321a0 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20  : R-19920-11576 
321b0 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76  However, newer v
321c0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
321d0 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a  e still.      **
321e0 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65   avoid using the
321f0 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69 65   last six entrie
32200 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s in the freelis
32210 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72  t trunk page arr
32220 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ay in.      ** o
32230 72 64 65 72 20 74 68 61 74 20 64 61 74 61 62 61  rder that databa
32240 73 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64  se files created
32250 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f   by newer versio
32260 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e  ns of SQLite can
32270 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   be.      ** rea
32280 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
32290 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20  ons of SQLite.. 
322a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
322b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
322c0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
322d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
322e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
322f0 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
32300 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
32310 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a  a[4], nLeaf+1);.
32320 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
32330 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
32340 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67  8+nLeaf*4], iPag
32350 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
32360 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62  pPage && (pBt->b
32370 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
32380 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20  CURE_DELETE)==0 
32390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
323a0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
323b0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
323c0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
323d0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
323e0 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  SetHasContent(pB
323f0 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  t, iPage);.     
32400 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28   }.      TRACE((
32410 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c  "FREE-PAGE: %d l
32420 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  eaf on trunk pag
32430 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70  e %d\n",pPage->p
32440 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  gno,pTrunk->pgno
32450 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  ));.      goto f
32460 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
32470 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
32480 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f  control flows to
32490 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
324a0 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73  n it was not pos
324b0 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
324c0 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62  .  ** the page b
324d0 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
324e0 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65  leaf page of the
324f0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
32500 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
32510 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63   ** Possibly bec
32520 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69  ause the free-li
32530 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20  st is empty, or 
32540 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  possibly because
32550 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74   the .  ** first
32560 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
32570 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e  ee-list is full.
32580 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65   Either way, the
32590 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
325a0 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f  d.  ** will beco
325b0 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74  me the new first
325c0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
325d0 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
325e0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d  */.  if( pPage==
325f0 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  0 && SQLITE_OK!=
32600 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
32610 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
32620 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20  pPage, 0)) ){.  
32630 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
32640 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  out;.  }.  rc = 
32650 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32660 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
32670 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
32680 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
32690 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
326a0 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28  .  }.  put4byte(
326b0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
326c0 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74  runk);.  put4byt
326d0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
326e0 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79  4], 0);.  put4by
326f0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
32700 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20  a[32], iPage);. 
32710 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
32720 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b  GE: %d new trunk
32730 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20   page replacing 
32740 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
32750 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66  no, iTrunk));..f
32760 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  reepage_out:.  i
32770 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
32780 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
32790 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  0;.  }.  release
327a0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
327b0 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
327c0 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  k);.  return rc;
327d0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
327e0 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  reePage(MemPage 
327f0 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43  *pPage, int *pRC
32800 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d  ){.  if( (*pRC)=
32810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32820 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67    *pRC = freePag
32830 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  e2(pPage->pBt, p
32840 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Page, pPage->pgn
32850 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
32860 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
32870 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
32880 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
32890 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74 65 20  en Cell.  Write 
328a0 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c  the.** local Cel
328b0 6c 20 73 69 7a 65 20 28 74 68 65 20 6e 75 6d 62  l size (the numb
328c0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e 20 74  er of bytes on t
328d0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
328e0 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76  , omitting.** ov
328f0 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e  erflow) into *pn
32900 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
32910 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20  int clearCell(. 
32920 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
32930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
32940 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
32950 69 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a  ins the Cell */.
32960 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
32970 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69  *pCell,    /* Fi
32980 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
32990 43 65 6c 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70  Cell */.  u16 *p
329a0 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
329b0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
329c0 73 69 7a 65 20 6f 66 20 74 68 65 20 43 65 6c 6c  size of the Cell
329d0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74   here */.){.  Bt
329e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
329f0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
32a00 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
32a10 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
32a20 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
32a30 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67  l;.  u32 ovflPag
32a40 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
32a50 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
32a60 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
32a70 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
32a80 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
32a90 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
32aa0 66 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d  fo);.  *pnSize =
32ab0 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69   info.nSize;.  i
32ac0 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
32ad0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
32ae0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
32af0 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
32b00 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
32b10 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
32b20 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
32b30 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72  pCell+info.iOver
32b40 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e  flow+3 > pPage->
32b50 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73  aData+pPage->mas
32b60 6b 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  kPage ){.    ret
32b70 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
32b80 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c  PT_BKPT;  /* Cel
32b90 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65  l extends past e
32ba0 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20  nd of page */.  
32bb0 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67  }.  ovflPgno = g
32bc0 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
32bd0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
32be0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
32bf0 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29  usableSize > 4 )
32c00 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  ;.  ovflPageSize
32c10 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
32c20 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20  ze - 4;.  nOvfl 
32c30 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  = (info.nPayload
32c40 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
32c50 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20   ovflPageSize - 
32c60 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  1)/ovflPageSize;
32c70 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c  .  assert( nOvfl
32c80 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52  >0 || .    (CORR
32c90 55 50 54 5f 44 42 20 26 26 20 28 69 6e 66 6f 2e  UPT_DB && (info.
32ca0 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50  nPayload + ovflP
32cb0 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67  ageSize)<ovflPag
32cc0 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68  eSize).  );.  wh
32cd0 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
32ce0 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d      Pgno iNext =
32cf0 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   0;.    MemPage 
32d00 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20  *pOvfl = 0;.    
32d10 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c  if( ovflPgno<2 |
32d20 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65  | ovflPgno>btree
32d30 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
32d40 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20  {.      /* 0 is 
32d50 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65  not a legal page
32d60 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
32d70 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20   1 cannot be an 
32d80 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
32d90 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f  ow page. Therefo
32da0 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32  re if ovflPgno<2
32db0 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64   or past the end
32dc0 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   of the .      *
32dd0 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62  * file the datab
32de0 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
32df0 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  upt. */.      re
32e00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
32e10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
32e20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b      if( nOvfl ){
32e30 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f  .      rc = getO
32e40 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
32e50 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
32e60 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20  l, &iNext);.    
32e70 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
32e80 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
32e90 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20   if( ( pOvfl || 
32ea0 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50  ((pOvfl = btreeP
32eb0 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f  ageLookup(pBt, o
32ec0 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a  vflPgno))!=0) ).
32ed0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
32ee0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
32ef0 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
32f00 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=1.    ){.     
32f10 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
32f20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f  reason any curso
32f30 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e  r should have an
32f40 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
32f50 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a  erence .      **
32f60 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
32f70 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
32f80 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73  o a cell that is
32f90 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75   being deleted/u
32fa0 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a  pdated..      **
32fb0 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69   So if there exi
32fc0 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  sts more than on
32fd0 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
32fe0 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69  his page, then i
32ff0 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74  t .      ** must
33000 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61   not really be a
33010 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
33020 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
33030 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
33040 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69  . .      ** It i
33050 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74  s helpful to det
33060 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20  ect this before 
33070 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65  calling freePage
33080 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a  2(), as .      *
33090 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61  * freePage2() ma
330a0 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20  y zero the page 
330b0 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75  contents if secu
330c0 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69  re-delete mode i
330d0 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c  s.      ** enabl
330e0 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65  ed. If this 'ove
330f0 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70  rflow' page happ
33100 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65  ens to be a page
33110 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
33120 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65  ** caller is ite
33130 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f  rating through o
33140 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20  r using in some 
33150 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a  other way, this.
33160 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20        ** can be 
33170 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20  problematic..   
33180 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
33190 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
331a0 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BKPT;.    }else{
331b0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65  .      rc = free
331c0 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c  Page2(pBt, pOvfl
331d0 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20  , ovflPgno);.   
331e0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66   }..    if( pOvf
331f0 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
33200 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
33210 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
33220 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
33230 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33240 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74  ovflPgno = iNext
33250 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
33260 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
33270 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
33280 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
33290 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
332a0 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
332b0 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
332c0 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
332d0 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
332e0 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
332f0 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
33300 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
33310 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
33320 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
33330 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
33340 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
33350 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
33360 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
33370 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
33380 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
33390 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
333a0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
333b0 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
333c0 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
333d0 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
333e0 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
333f0 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
33400 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
33410 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
33420 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
33430 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
33440 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
33450 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
33460 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
33470 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
33480 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
33490 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
334a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
334b0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
334c0 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
334d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
334e0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
334f0 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
33500 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
33510 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
33520 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
33530 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
33540 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
33550 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
33560 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
33570 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
33580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33590 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74  * Extra zero byt
335a0 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
335b0 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a  pData */.  int *
335c0 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
335d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
335e0 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
335f0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
33600 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
33610 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
33620 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
33630 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
33640 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
33650 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
33660 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
33670 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
33680 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
33690 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
336a0 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
336b0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
336c0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
336d0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
336e0 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  der;..  assert( 
336f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
33700 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
33710 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70  utex) );..  /* p
33720 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  Page is not nece
33730 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c  ssarily writeabl
33740 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69  e since pCell mi
33750 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79  ght be auxiliary
33760 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61  .  ** buffer spa
33770 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72  ce that is separ
33780 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ate from the pPa
33790 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a  ge buffer area *
337a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  /.  assert( pCel
337b0 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  l<pPage->aData |
337c0 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d  | pCell>=&pPage-
337d0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
337e0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
337f0 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
33800 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
33810 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
33820 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
33830 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e  e header. */.  n
33840 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e  Header = pPage->
33850 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
33860 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61  nPayload = nData
33870 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20   + nZero;.  if( 
33880 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
33890 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  f ){.    nHeader
338a0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28   += putVarint32(
338b0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
338c0 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65   nPayload);.  }e
338d0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
338e0 20 6e 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20   nData==0 );.   
338f0 20 61 73 73 65 72 74 28 20 6e 5a 65 72 6f 3d 3d   assert( nZero==
33900 30 20 29 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64  0 );.  }.  nHead
33910 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
33920 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
33930 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a   *(u64*)&nKey);.
33940 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
33950 74 68 65 20 70 61 79 6c 6f 61 64 20 73 69 7a 65  the payload size
33960 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
33970 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70  >intKey ){.    p
33980 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
33990 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
339a0 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20     nData = 0;.  
339b0 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65  }else{ .    asse
339c0 72 74 28 20 6e 4b 65 79 3c 3d 30 78 37 66 66 66  rt( nKey<=0x7fff
339d0 66 66 66 66 20 26 26 20 70 4b 65 79 21 3d 30 20  ffff && pKey!=0 
339e0 29 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  );.    nPayload 
339f0 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20  = (int)nKey;.   
33a00 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
33a10 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b    nSrc = (int)nK
33a20 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  ey;.  }.  if( nP
33a30 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
33a40 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e  axLocal ){.    n
33a50 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61   = nHeader + nPa
33a60 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63  yload;.    testc
33a70 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20  ase( n==3 );.   
33a80 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20   testcase( n==4 
33a90 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29  );.    if( n<4 )
33aa0 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53   n = 4;.    *pnS
33ab0 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61  ize = n;.    spa
33ac0 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61  ceLeft = nPayloa
33ad0 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  d;.    pPrior = 
33ae0 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCell;.  }else{.
33af0 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61      int mn = pPa
33b00 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
33b10 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79    n = mn + (nPay
33b20 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50  load - mn) % (pP
33b30 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
33b40 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
33b50 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67  estcase( n==pPag
33b60 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
33b70 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
33b80 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
33b90 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e  1 );.    if( n >
33ba0 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
33bb0 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73   ) n = mn;.    s
33bc0 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20  paceLeft = n;.  
33bd0 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20    *pnSize = n + 
33be0 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20  nHeader + 4;.   
33bf0 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
33c00 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d  [nHeader+n];.  }
33c10 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
33c20 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a  Cell[nHeader];..
33c30 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
33c40 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f  nt variables sho
33c50 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66 6f  uld be set as fo
33c60 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
33c70 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20     nPayload     
33c80 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c        Total payl
33c90 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65  oad size in byte
33ca0 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61  s.  **   pPayloa
33cb0 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69  d           Begi
33cc0 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61  n writing payloa
33cd0 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70  d here.  **   sp
33ce0 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20 20  aceLeft         
33cf0 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
33d00 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49   at pPayload.  I
33d10 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65  f nPayload>space
33d20 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20  Left,.  **      
33d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d40 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65  that means conte
33d50 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e  nt must spill in
33d60 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
33d70 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a  s..  **   *pnSiz
33d80 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69 7a  e            Siz
33d90 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63  e of the local c
33da0 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ell (not countin
33db0 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  g overflow pages
33dc0 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20  ).  **   pPrior 
33dd0 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72              Wher
33de0 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70  e to write the p
33df0 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74  gno of the first
33e00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
33e10 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63   **.  ** Use a c
33e20 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73  all to btreePars
33e30 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65  eCellPtr() to ve
33e40 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76 61  rify that the va
33e50 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20  lues above.  ** 
33e60 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f  were computed co
33e70 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69  rrectly..  */.#i
33e80 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
33e90 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20   {.    CellInfo 
33ea0 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d  info;.    pPage-
33eb0 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
33ec0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
33ed0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 48  ;.    assert( nH
33ee0 65 61 64 65 72 3d 28 69 6e 74 29 28 69 6e 66 6f  eader=(int)(info
33ef0 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c  .pPayload - pCel
33f00 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  l) );.    assert
33f10 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
33f20 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
33f30 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f   *pnSize == info
33f40 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  .nSize );.    as
33f50 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20  sert( spaceLeft 
33f60 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  == info.nLocal )
33f70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
33f80 72 69 6f 72 20 3d 3d 20 26 70 43 65 6c 6c 5b 69  rior == &pCell[i
33f90 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 20 29  nfo.iOverflow] )
33fa0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
33fb0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79  /* Write the pay
33fc0 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f  load into the lo
33fd0 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79  cal Cell and any
33fe0 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72   extra into over
33ff0 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20  flow pages */.  
34000 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
34010 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
34020 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
34030 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34040 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
34050 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
34060 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
34070 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
34080 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
34090 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
340a0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
340b0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
340c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
340d0 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
340e0 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
340f0 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
34100 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
34110 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
34120 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
34130 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
34140 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
34150 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
34160 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
34170 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
34180 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
34190 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
341a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
341b0 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
341c0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
341d0 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
341e0 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
341f0 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
34200 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
34210 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
34220 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
34230 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
34240 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
34250 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
34260 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
34270 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
34280 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
34290 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
342a0 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
342b0 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
342c0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
342d0 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
342e0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
342f0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
34300 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
34310 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
34320 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
34330 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
34340 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
34350 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
34360 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
34370 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ized values and 
34380 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
34390 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
343a0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
343b0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
343c0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
343d0 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
343e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
343f0 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
34400 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
34410 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
34420 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
34430 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
34440 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
34450 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
34460 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
34470 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
34480 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
34490 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
344a0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
344b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
344c0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
344d0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
344e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
344f0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
34500 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
34510 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
34520 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
34530 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
34540 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
34550 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
34560 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
34570 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
34580 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
34590 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
345a0 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
345b0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
345c0 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
345d0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
345e0 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
345f0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
34600 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
34610 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
34620 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
34630 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
34640 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
34650 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
34660 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
34670 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
34680 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
34690 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
346a0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
346b0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
346c0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
346d0 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
346e0 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
346f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
34700 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
34710 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
34720 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
34730 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
34740 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
34750 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
34760 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
34770 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
34780 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
34790 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
347a0 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
347b0 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
347c0 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
347d0 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
347e0 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
347f0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
34800 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
34810 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
34820 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
34830 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
34840 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
34850 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
34860 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
34870 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
34880 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
34890 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
348a0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
348b0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
348c0 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
348d0 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
348e0 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
348f0 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
34900 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
34910 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
34920 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
34930 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
34940 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
34950 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
34960 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
34970 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
34980 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
34990 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
349a0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
349b0 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
349c0 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
349d0 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
349e0 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
349f0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
34a00 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
34a10 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
34a20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
34a30 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
34a40 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
34a50 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
34a60 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
34a70 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
34a80 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
34a90 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
34aa0 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
34ab0 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
34ac0 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
34ad0 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
34ae0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
34af0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
34b00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
34b10 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
34b20 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
34b30 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
34b40 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
34b50 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
34b60 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
34b70 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
34b80 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
34b90 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
34ba0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
34bb0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
34bc0 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
34bd0 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
34be0 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
34bf0 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
34c00 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
34c10 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
34c20 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
34c30 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
34c40 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
34c50 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
34c60 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
34c70 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
34c80 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
34c90 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
34ca0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
34cb0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
34cc0 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
34cd0 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
34ce0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
34cf0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
34d00 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
34d10 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
34d20 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
34d30 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
34d40 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
34d50 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
34d60 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
34d70 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
34d80 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
34d90 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
34da0 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
34db0 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
34dc0 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
34dd0 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
34de0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
34df0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
34e00 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  B || sz==cellSiz
34e10 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b  e(pPage, idx) );
34e20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
34e30 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
34e40 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
34e50 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
34e60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
34e70 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
34e80 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20  utex) );.  data 
34e90 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
34ea0 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e    ptr = &pPage->
34eb0 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b  aCellIdx[2*idx];
34ec0 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
34ed0 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70  (ptr);.  hdr = p
34ee0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
34ef0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d  .  testcase( pc=
34f00 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
34f10 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73  hdr+5]) );.  tes
34f20 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50  tcase( pc+sz==pP
34f30 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
34f40 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63  Size );.  if( pc
34f50 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65   < (u32)get2byte
34f60 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c  (&data[hdr+5]) |
34f70 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d  | pc+sz > pPage-
34f80 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
34f90 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
34fa0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
34fb0 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
34fc0 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53    }.  rc = freeS
34fd0 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
34fe0 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  sz);.  if( rc ){
34ff0 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
35000 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
35010 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
35020 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
35030 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d  Cell==0 ){.    m
35040 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
35050 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64  1], 0, 4);.    d
35060 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
35070 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
35080 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65  ta[hdr+5], pPage
35090 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
350a0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  e);.    pPage->n
350b0 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Free = pPage->pB
350c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
350d0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
350e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
350f0 20 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d          - pPage-
35100 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20  >childPtrSize - 
35110 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  8;.  }else{.    
35120 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72  memmove(ptr, ptr
35130 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43  +2, 2*(pPage->nC
35140 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20  ell - idx));.   
35150 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
35160 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  hdr+3], pPage->n
35170 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  Cell);.    pPage
35180 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20  ->nFree += 2;.  
35190 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  }.}../*.** Inser
351a0 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
351b0 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
351c0 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
351d0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
351e0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
351f0 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
35200 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
35210 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
35220 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
35230 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
35240 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
35250 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
35260 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
35270 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
35280 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
35290 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
352a0 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
352b0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
352c0 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
352d0 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d  ->apOvfl[] and m
352e0 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20  ake it point to 
352f0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
35300 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70   (either.** in p
35310 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67  Temp or the orig
35320 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20  inal pCell) and 
35330 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20  also record its 
35340 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63  index. .** Alloc
35350 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72  ating a new entr
35360 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  y in pPage->aCel
35370 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74  l[] implies that
35380 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65   .** pPage->nOve
35390 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65  rflow is increme
353a0 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
353b0 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28  void insertCell(
353c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
353d0 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
353e0 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
353f0 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
35400 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
35410 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
35420 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
35430 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
35440 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
35450 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
35460 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
35470 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
35480 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
35490 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
354a0 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
354b0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
354c0 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
354d0 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
354e0 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ded */.  Pgno iC
354f0 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66  hild,      /* If
35500 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61   non-zero, repla
35510 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  ce first 4 bytes
35520 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65   with this value
35530 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20   */.  int *pRC  
35540 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
35550 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e  and write return
35560 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20   code from here 
35570 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20  */.){.  int idx 
35580 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65  = 0;      /* Whe
35590 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20  re to write new 
355a0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
355b0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
355c0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
355d0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
355e0 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
355f0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
35600 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65  ent of the whole
35610 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
35620 49 6e 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Ins;         /* 
35630 54 68 65 20 70 6f 69 6e 74 20 69 6e 20 70 50 61  The point in pPa
35640 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20 77  ge->aCellIdx[] w
35650 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e 73  here no cell ins
35660 65 72 74 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20  erted */..  if( 
35670 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
35680 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
35690 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
356a0 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
356b0 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
356c0 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
356d0 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20  Bt)<=10921 );.  
356e0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
356f0 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50  Cell<=MX_CELL(pP
35700 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52  age->pBt) || COR
35710 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
35720 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
35730 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65  rflow<=ArraySize
35740 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20  (pPage->apOvfl) 
35750 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72  );.  assert( Arr
35760 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70  aySize(pPage->ap
35770 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65  Ovfl)==ArraySize
35780 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20  (pPage->aiOvfl) 
35790 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
357a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
357b0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
357c0 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63  x) );.  /* The c
357d0 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  ell should norma
357e0 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72  lly be sized cor
357f0 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72  rectly.  However
35800 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a  , when moving a.
35810 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63    ** malformed c
35820 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20  ell from a leaf 
35830 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72  page to an inter
35840 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65  ior page, if the
35850 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20   cell size.  ** 
35860 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73  wanted to be les
35870 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74  s than 4 but got
35880 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34   rounded up to 4
35890 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68   on the leaf, th
358a0 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67  en size.  ** mig
358b0 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ht be less than 
358c0 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70  8 (leaf-size + p
358d0 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69  ointer) on the i
358e0 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48  nterior node.  H
358f0 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65  ence.  ** the te
35900 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20  rm after the || 
35910 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
35920 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20   assert(). */.  
35930 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67  assert( sz==pPag
35940 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
35950 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73  ge, pCell) || (s
35960 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30  z==8 && iChild>0
35970 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
35980 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
35990 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
359a0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
359b0 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
359c0 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20  y(pTemp, pCell, 
359d0 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  sz);.      pCell
359e0 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
359f0 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
35a00 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
35a10 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b  (pCell, iChild);
35a20 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
35a30 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
35a40 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
35a50 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50  <(int)(sizeof(pP
35a60 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a  age->apOvfl)/siz
35a70 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  eof(pPage->apOvf
35a80 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50  l[0])) );.    pP
35a90 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d  age->apOvfl[j] =
35aa0 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
35ab0 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28  e->aiOvfl[j] = (
35ac0 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57  u16)i;..    /* W
35ad0 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65  hen multiple ove
35ae0 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68  rflows occur, th
35af0 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 73 65  ey are always se
35b00 71 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a  quential and in.
35b10 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72      ** sorted or
35b20 64 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72  der.  This invar
35b30 69 61 6e 74 73 20 61 72 69 73 65 20 62 65 63 61  iants arise beca
35b40 75 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65  use multiple ove
35b50 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a  rflows can.    *
35b60 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65  * only occur whe
35b70 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69  n inserting divi
35b80 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
35b90 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 64  he parent page d
35ba0 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c  uring.    ** bal
35bb0 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20  ancing, and the 
35bc0 64 69 76 69 64 65 72 73 20 61 72 65 20 61 64 6a  dividers are adj
35bd0 61 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64  acent and sorted
35be0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
35bf0 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61  ert( j==0 || pPa
35c00 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c  ge->aiOvfl[j-1]<
35c10 28 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65  (u16)i ); /* Ove
35c20 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64  rflows in sorted
35c30 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73   order */.    as
35c40 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d  sert( j==0 || i=
35c50 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a  =pPage->aiOvfl[j
35c60 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76  -1]+1 );   /* Ov
35c70 65 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75  erflows are sequ
35c80 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73  ential */.  }els
35c90 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
35ca0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
35cb0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
35cc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
35cd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35ce0 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
35cf0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
35d00 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
35d10 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
35d20 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
35d30 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
35d40 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
35d50 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 64 61  .    assert( &da
35d60 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
35d70 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43  fset]==pPage->aC
35d80 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63  ellIdx );.    rc
35d90 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
35da0 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
35db0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
35dc0 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
35dd0 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
35de0 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
35df0 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
35e00 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
35e10 67 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20  g properties.   
35e20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e   ** if it return
35e30 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a  s successfully *
35e40 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  /.    assert( id
35e50 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73  x >= 0 );.    as
35e60 73 65 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61  sert( idx >= pPa
35e70 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  ge->cellOffset+2
35e80 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20  *pPage->nCell+2 
35e90 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
35ea0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
35eb0 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  +sz <= (int)pPag
35ec0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
35ed0 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ze );.    pPage-
35ee0 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
35ef0 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
35f00 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  cpy(&data[idx], 
35f10 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
35f20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
35f30 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61      put4byte(&da
35f40 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29  ta[idx], iChild)
35f50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73  ;.    }.    pIns
35f60 20 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49   = pPage->aCellI
35f70 64 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65  dx + i*2;.    me
35f80 6d 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49  mmove(pIns+2, pI
35f90 6e 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43  ns, 2*(pPage->nC
35fa0 65 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70  ell - i));.    p
35fb0 75 74 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64  ut2byte(pIns, id
35fc0 78 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  x);.    pPage->n
35fd0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69  Cell++;.    /* i
35fe0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c  ncrement the cel
35ff0 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69  l count */.    i
36000 66 28 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65  f( (++data[pPage
36010 2d 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d  ->hdrOffset+4])=
36020 3d 30 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d  =0 ) data[pPage-
36030 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b  >hdrOffset+3]++;
36040 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
36050 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
36060 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29  e->hdrOffset+3])
36070 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
36080 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
36090 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
360a0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
360b0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
360c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
360d0 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
360e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
360f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
36100 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
36110 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
36120 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
36130 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
36140 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
36150 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61    */.      ptrma
36160 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
36170 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a  e, pCell, pRC);.
36180 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
36190 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c  .}../*.** A Cell
361a0 41 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e  Array object con
361b0 74 61 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66  tains a cache of
361c0 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69   pointers and si
361d0 7a 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e  zes for a.** con
361e0 73 65 63 75 74 69 76 65 20 73 65 71 75 65 6e 63  secutive sequenc
361f0 65 20 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20  e of cells that 
36200 6d 69 67 68 74 20 62 65 20 68 65 6c 64 20 6d 75  might be held mu
36210 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 0a 2a 2f  ltiple pages..*/
36220 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
36230 43 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c 41 72  CellArray CellAr
36240 72 61 79 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c  ray;.struct Cell
36250 41 72 72 61 79 20 7b 0a 20 20 69 6e 74 20 6e 43  Array {.  int nC
36260 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
36270 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
36280 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
36290 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
362a0 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Ref;          /*
362b0 20 52 65 66 65 72 65 6e 63 65 20 70 61 67 65 20   Reference page 
362c0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
362d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
362e0 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
362f0 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31  balanced */.  u1
36300 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  6 *szCell;      
36310 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73        /* Local s
36320 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
36330 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
36340 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  };../*.** Make s
36350 75 72 65 20 74 68 65 20 63 65 6c 6c 20 73 69 7a  ure the cell siz
36360 65 73 20 61 74 20 69 64 78 2c 20 69 64 78 2b 31  es at idx, idx+1
36370 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20 68  , ..., idx+N-1 h
36380 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70  ave been.** comp
36390 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
363a0 76 6f 69 64 20 70 6f 70 75 6c 61 74 65 43 65 6c  void populateCel
363b0 6c 43 61 63 68 65 28 43 65 6c 6c 41 72 72 61 79  lCache(CellArray
363c0 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e   *p, int idx, in
363d0 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t N){.  assert( 
363e0 69 64 78 3e 3d 30 20 26 26 20 69 64 78 2b 4e 3c  idx>=0 && idx+N<
363f0 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 77  =p->nCell );.  w
36400 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20 20 20  hile( N>0 ){.   
36410 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 65   assert( p->apCe
36420 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a 20 20  ll[idx]!=0 );.  
36430 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b    if( p->szCell[
36440 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  idx]==0 ){.     
36450 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 20   p->szCell[idx] 
36460 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c  = p->pRef->xCell
36470 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d  Size(p->pRef, p-
36480 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a 20  >apCell[idx]);. 
36490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
364a0 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
364b0 44 42 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  DB ||.          
364c0 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64      p->szCell[id
364d0 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78 43 65  x]==p->pRef->xCe
364e0 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20  llSize(p->pRef, 
364f0 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 20  p->apCell[idx]) 
36500 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78  );.    }.    idx
36510 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d  ++;.    N--;.  }
36520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
36530 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
36540 20 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20   Nth element of 
36550 74 68 65 20 63 65 6c 6c 20 61 72 72 61 79 0a 2a  the cell array.*
36560 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
36570 4e 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63 6f 6d  NOINLINE u16 com
36580 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 43 65 6c  puteCellSize(Cel
36590 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e  lArray *p, int N
365a0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d  ){.  assert( N>=
365b0 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20  0 && N<p->nCell 
365c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
365d0 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a  szCell[N]==0 );.
365e0 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 3d    p->szCell[N] =
365f0 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53   p->pRef->xCellS
36600 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e  ize(p->pRef, p->
36610 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72 65  apCell[N]);.  re
36620 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e  turn p->szCell[N
36630 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20  ];.}.static u16 
36640 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 43  cachedCellSize(C
36650 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74  ellArray *p, int
36660 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e   N){.  assert( N
36670 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c  >=0 && N<p->nCel
36680 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 7a  l );.  if( p->sz
36690 43 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75 72 6e  Cell[N] ) return
366a0 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20   p->szCell[N];. 
366b0 20 72 65 74 75 72 6e 20 63 6f 6d 70 75 74 65 43   return computeC
366c0 65 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b 0a 7d  ellSize(p, N);.}
366d0 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70  ../*.** Array ap
366e0 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
366f0 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c  pointers to nCel
36700 6c 20 62 2d 74 72 65 65 20 70 61 67 65 20 63 65  l b-tree page ce
36710 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43  lls. The .** szC
36720 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  ell[] array cont
36730 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e  ains the size in
36740 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 63   bytes of each c
36750 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
36760 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20 74  on.** replaces t
36770 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
36780 6e 74 73 20 6f 66 20 70 61 67 65 20 70 50 67 20  nts of page pPg 
36790 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  with the content
367a0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s of the cell.**
367b0 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f   array..**.** So
367c0 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  me of the cells 
367d0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20  in apCell[] may 
367e0 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f  currently be sto
367f0 72 65 64 20 69 6e 20 70 50 67 2e 20 54 68 69 73  red in pPg. This
36800 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  .** function wor
36810 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65  ks around proble
36820 6d 73 20 63 61 75 73 65 64 20 62 79 20 74 68 69  ms caused by thi
36830 73 20 62 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f  s by making a co
36840 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75  py of any .** su
36850 63 68 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20  ch cells before 
36860 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20  overwriting the 
36870 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  page data..**.**
36880 20 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72   The MemPage.nFr
36890 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61  ee field is inva
368a0 6c 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20  lidated by this 
368b0 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  function. It is 
368c0 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
368d0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
368e0 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20 63  ller to set it c
368f0 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61  orrectly..*/.sta
36900 74 69 63 20 69 6e 74 20 72 65 62 75 69 6c 64 50  tic int rebuildP
36910 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age(.  MemPage *
36920 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
36930 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74         /* Edit t
36940 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  his page */.  in
36950 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
36960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36970 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Final number of
36980 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a   cells on page *
36990 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
369a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
369b0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
369c0 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a  cells */.  u16 *
369d0 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20  szCell          
369e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
369f0 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65  ray of cell size
36a00 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  s */.){.  const 
36a10 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68  int hdr = pPg->h
36a20 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
36a30 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
36a40 68 65 61 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f  header on pPg */
36a50 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
36a60 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
36a70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
36a80 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66  ointer to data f
36a90 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73  or pPg */.  cons
36aa0 74 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65  t int usableSize
36ab0 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61   = pPg->pBt->usa
36ac0 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20  bleSize;.  u8 * 
36ad0 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44  const pEnd = &aD
36ae0 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b  ata[usableSize];
36af0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a  .  int i;.  u8 *
36b00 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e  pCellptr = pPg->
36b10 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a  aCellIdx;.  u8 *
36b20 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  pTmp = sqlite3Pa
36b30 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 67  gerTempSpace(pPg
36b40 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
36b50 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20    u8 *pData;..  
36b60 69 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  i = get2byte(&aD
36b70 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d  ata[hdr+5]);.  m
36b80 65 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20  emcpy(&pTmp[i], 
36b90 26 61 44 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c  &aData[i], usabl
36ba0 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70  eSize - i);..  p
36bb0 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66  Data = pEnd;.  f
36bc0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
36bd0 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
36be0 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d  Cell = apCell[i]
36bf0 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e  ;.    if( pCell>
36c00 61 44 61 74 61 20 26 26 20 70 43 65 6c 6c 3c 70  aData && pCell<p
36c10 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 70 43 65  End ){.      pCe
36c20 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c  ll = &pTmp[pCell
36c30 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d   - aData];.    }
36c40 0a 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a  .    pData -= sz
36c50 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 70 75 74  Cell[i];.    put
36c60 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20  2byte(pCellptr, 
36c70 28 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 29  (pData - aData))
36c80 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b  ;.    pCellptr +
36c90 3d 20 32 3b 0a 20 20 20 20 69 66 28 20 70 44 61  = 2;.    if( pDa
36ca0 74 61 20 3c 20 70 43 65 6c 6c 70 74 72 20 29 20  ta < pCellptr ) 
36cb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
36cc0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
36cd0 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70 43  memcpy(pData, pC
36ce0 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b  ell, szCell[i]);
36cf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 43  .    assert( szC
36d00 65 6c 6c 5b 69 5d 3d 3d 70 50 67 2d 3e 78 43 65  ell[i]==pPg->xCe
36d10 6c 6c 53 69 7a 65 28 70 50 67 2c 20 70 43 65 6c  llSize(pPg, pCel
36d20 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  l) || CORRUPT_DB
36d30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
36d40 28 20 73 7a 43 65 6c 6c 5b 69 5d 21 3d 70 50 67  ( szCell[i]!=pPg
36d50 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c  ->xCellSize(pPg,
36d60 70 43 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a 20  pCell) );.  }.. 
36d70 20 2f 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72   /* The pPg->nFr
36d80 65 65 20 66 69 65 6c 64 20 69 73 20 6e 6f 77 20  ee field is now 
36d90 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  set incorrectly.
36da0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
36db0 20 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20 70 50   fix it. */.  pP
36dc0 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c  g->nCell = nCell
36dd0 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c  ;.  pPg->nOverfl
36de0 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62  ow = 0;..  put2b
36df0 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 31  yte(&aData[hdr+1
36e00 5d 2c 20 30 29 3b 0a 20 20 70 75 74 32 62 79 74  ], 0);.  put2byt
36e10 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c  e(&aData[hdr+3],
36e20 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20   pPg->nCell);.  
36e30 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
36e40 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20  hdr+5], pData - 
36e50 61 44 61 74 61 29 3b 0a 20 20 61 44 61 74 61 5b  aData);.  aData[
36e60 68 64 72 2b 37 5d 20 3d 20 30 78 30 30 3b 0a 20  hdr+7] = 0x00;. 
36e70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
36e80 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61  K;.}../*.** Arra
36e90 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  y apCell[] conta
36ea0 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65  ins nCell pointe
36eb0 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c  rs to b-tree cel
36ec0 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c  ls. Array szCell
36ed0 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  .** contains the
36ee0 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
36ef0 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c  f each such cell
36f00 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
36f10 61 74 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a 20  attempts to .** 
36f20 61 64 64 20 74 68 65 20 63 65 6c 6c 73 20 73 74  add the cells st
36f30 6f 72 65 64 20 69 6e 20 74 68 65 20 61 72 72 61  ored in the arra
36f40 79 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 49  y to page pPg. I
36f50 66 20 69 74 20 63 61 6e 6e 6f 74 20 28 62 65 63  f it cannot (bec
36f60 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
36f70 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64 65  e needs to be de
36f80 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f 72  fragmented befor
36f90 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69 6c 6c  e the cells will
36fa0 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a   fit), non-zero.
36fb0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
36fc0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
36fd0 65 20 63 65 6c 6c 73 20 61 72 65 20 61 64 64 65  e cells are adde
36fe0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
36ff0 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75 72  zero is.** retur
37000 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ned..**.** Argum
37010 65 6e 74 20 70 43 65 6c 6c 70 74 72 20 70 6f 69  ent pCellptr poi
37020 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
37030 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 65   entry in the ce
37040 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
37050 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20 70 61 67  .** (part of pag
37060 65 20 70 50 67 29 20 74 6f 20 70 6f 70 75 6c 61  e pPg) to popula
37070 74 65 2e 20 41 66 74 65 72 20 63 65 6c 6c 20 61  te. After cell a
37080 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69 74  pCell[0] is writ
37090 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70 61  ten to the.** pa
370a0 67 65 20 62 6f 64 79 2c 20 61 20 31 36 2d 62 69  ge body, a 16-bi
370b0 74 20 6f 66 66 73 65 74 20 69 73 20 77 72 69 74  t offset is writ
370c0 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72 2e  ten to pCellptr.
370d0 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72 20   And so on, for 
370e0 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  each.** cell in 
370f0 74 68 65 20 61 72 72 61 79 2e 20 49 74 20 69 73  the array. It is
37100 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
37110 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
37120 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74  r to ensure.** t
37130 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74  hat it is safe t
37140 6f 20 6f 76 65 72 77 72 69 74 65 20 74 68 69 73  o overwrite this
37150 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c   part of the cel
37160 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 2e  l-pointer array.
37170 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
37180 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
37190 6c 65 64 2c 20 2a 70 70 44 61 74 61 20 70 6f 69  led, *ppData poi
371a0 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74  nts to the start
371b0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74   of the .** cont
371c0 65 6e 74 20 61 72 65 61 20 6f 6e 20 70 61 67 65  ent area on page
371d0 20 70 50 67 2e 20 49 66 20 74 68 65 20 73 69 7a   pPg. If the siz
371e0 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  e of the content
371f0 20 61 72 65 61 20 69 73 20 65 78 74 65 6e 64 65   area is extende
37200 64 2c 0a 2a 2a 20 2a 70 70 44 61 74 61 20 69 73  d,.** *ppData is
37210 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69 6e   updated to poin
37220 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 61  t to the new sta
37230 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  rt of the conten
37240 74 20 61 72 65 61 0a 2a 2a 20 62 65 66 6f 72 65  t area.** before
37250 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
37260 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 72 67 75 6d  * Finally, argum
37270 65 6e 74 20 70 42 65 67 69 6e 20 70 6f 69 6e 74  ent pBegin point
37280 73 20 74 6f 20 74 68 65 20 62 79 74 65 20 69 6d  s to the byte im
37290 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
372a0 69 6e 67 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f  ing the.** end o
372b0 66 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75  f the space requ
372c0 69 72 65 64 20 62 79 20 74 68 69 73 20 70 61 67  ired by this pag
372d0 65 20 66 6f 72 20 74 68 65 20 63 65 6c 6c 2d 70  e for the cell-p
372e0 6f 69 6e 74 65 72 20 61 72 65 61 20 28 66 6f 72  ointer area (for
372f0 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 2d 20  .** all cells - 
37300 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73 65 20 69  not just those i
37310 6e 73 65 72 74 65 64 20 62 79 20 74 68 65 20 63  nserted by the c
37320 75 72 72 65 6e 74 20 63 61 6c 6c 29 2e 20 49 66  urrent call). If
37330 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
37340 61 72 65 61 20 6d 75 73 74 20 62 65 20 65 78 74  area must be ext
37350 65 6e 64 65 64 20 74 6f 20 62 65 66 6f 72 65 20  ended to before 
37360 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
37370 64 65 72 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  der to accomodat
37380 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69  e all.** cells i
37390 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e  n apCell[], then
373a0 20 74 68 65 20 63 65 6c 6c 73 20 64 6f 20 6e 6f   the cells do no
373b0 74 20 66 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65  t fit and non-ze
373c0 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
373d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
373e0 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20  geInsertArray(. 
373f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
37400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37410 20 2f 2a 20 50 61 67 65 20 74 6f 20 61 64 64 20   /* Page to add 
37420 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20 75 38  cells to */.  u8
37430 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 20 20   *pBegin,       
37440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37450 20 45 6e 64 20 6f 66 20 63 65 6c 6c 2d 70 6f 69   End of cell-poi
37460 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
37470 75 38 20 2a 2a 70 70 44 61 74 61 2c 20 20 20 20  u8 **ppData,    
37480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37490 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 61 67 65 20  /* IN/OUT: Page 
374a0 63 6f 6e 74 65 6e 74 20 2d 61 72 65 61 20 70 6f  content -area po
374b0 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70  inter */.  u8 *p
374c0 43 65 6c 6c 70 74 72 2c 20 20 20 20 20 20 20 20  Cellptr,        
374d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
374e0 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 2d 70 6f  inter to cell-po
374f0 69 6e 74 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  inter area */.  
37500 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20 20  int iFirst,     
37510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37520 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
37530 74 20 63 65 6c 6c 20 74 6f 20 61 64 64 20 2a 2f  t cell to add */
37540 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
37550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37560 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
37570 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
37580 70 50 67 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72  pPg */.  CellArr
37590 61 79 20 2a 70 43 41 72 72 61 79 20 20 20 20 20  ay *pCArray     
375a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
375b0 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b  y of cells */.){
375c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a  .  int i;.  u8 *
375d0 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
375e0 74 61 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 20  ta;.  u8 *pData 
375f0 3d 20 2a 70 70 44 61 74 61 3b 0a 20 20 69 6e 74  = *ppData;.  int
37600 20 69 45 6e 64 20 3d 20 69 46 69 72 73 74 20 2b   iEnd = iFirst +
37610 20 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74   nCell;.  assert
37620 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
37630 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  pPg->hdrOffset==
37640 30 20 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72  0 );    /* Never
37650 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20   called on page 
37660 31 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69  1 */.  for(i=iFi
37670 72 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b  rst; i<iEnd; i++
37680 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 2c 20 72  ){.    int sz, r
37690 63 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f 74  c;.    u8 *pSlot
376a0 3b 0a 20 20 20 20 73 7a 20 3d 20 63 61 63 68 65  ;.    sz = cache
376b0 64 43 65 6c 6c 53 69 7a 65 28 70 43 41 72 72 61  dCellSize(pCArra
376c0 79 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 28  y, i);.    if( (
376d0 61 44 61 74 61 5b 31 5d 3d 3d 30 20 26 26 20 61  aData[1]==0 && a
376e0 44 61 74 61 5b 32 5d 3d 3d 30 29 20 7c 7c 20 28  Data[2]==0) || (
376f0 70 53 6c 6f 74 20 3d 20 70 61 67 65 46 69 6e 64  pSlot = pageFind
37700 53 6c 6f 74 28 70 50 67 2c 73 7a 2c 26 72 63 29  Slot(pPg,sz,&rc)
37710 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44  )==0 ){.      pD
37720 61 74 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20  ata -= sz;.     
37730 20 69 66 28 20 70 44 61 74 61 3c 70 42 65 67 69   if( pData<pBegi
37740 6e 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  n ) return 1;.  
37750 20 20 20 20 70 53 6c 6f 74 20 3d 20 70 44 61 74      pSlot = pDat
37760 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  a;.    }.    /* 
37770 70 53 6c 6f 74 20 61 6e 64 20 70 43 41 72 72 61  pSlot and pCArra
37780 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 20 77 69 6c  y->apCell[i] wil
37790 6c 20 6e 65 76 65 72 20 6f 76 65 72 6c 61 70 20  l never overlap 
377a0 6f 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  on a well-formed
377b0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
377c0 2e 20 20 42 75 74 20 74 68 65 79 20 6d 69 67 68  .  But they migh
377d0 74 20 66 6f 72 20 61 20 63 6f 72 72 75 70 74 20  t for a corrupt 
377e0 64 61 74 61 62 61 73 65 2e 20 20 48 65 6e 63 65  database.  Hence
377f0 20 75 73 65 20 6d 65 6d 6d 6f 76 65 28 29 0a 20   use memmove(). 
37800 20 20 20 2a 2a 20 73 69 6e 63 65 20 6d 65 6d 63     ** since memc
37810 70 79 28 29 20 73 65 6e 64 73 20 53 49 47 41 42  py() sends SIGAB
37820 4f 52 54 20 77 69 74 68 20 6f 76 65 72 6c 61 70  ORT with overlap
37830 70 69 6e 67 20 62 75 66 66 65 72 73 20 6f 6e 20  ping buffers on 
37840 4f 70 65 6e 42 53 44 20 2a 2f 0a 20 20 20 20 61  OpenBSD */.    a
37850 73 73 65 72 74 28 20 28 70 53 6c 6f 74 2b 73 7a  ssert( (pSlot+sz
37860 29 3c 3d 70 43 41 72 72 61 79 2d 3e 61 70 43 65  )<=pCArray->apCe
37870 6c 6c 5b 69 5d 0a 20 20 20 20 20 20 20 20 20 7c  ll[i].         |
37880 7c 20 70 53 6c 6f 74 3e 3d 28 70 43 41 72 72 61  | pSlot>=(pCArra
37890 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2b 73 7a 29  y->apCell[i]+sz)
378a0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  .         || COR
378b0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 6d  RUPT_DB );.    m
378c0 65 6d 6d 6f 76 65 28 70 53 6c 6f 74 2c 20 70 43  emmove(pSlot, pC
378d0 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d  Array->apCell[i]
378e0 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75 74 32 62  , sz);.    put2b
378f0 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70  yte(pCellptr, (p
37900 53 6c 6f 74 20 2d 20 61 44 61 74 61 29 29 3b 0a  Slot - aData));.
37910 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20      pCellptr += 
37920 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74 61  2;.  }.  *ppData
37930 20 3d 20 70 44 61 74 61 3b 0a 20 20 72 65 74 75   = pData;.  retu
37940 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
37950 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
37960 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69  ntains nCell poi
37970 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20  nters to b-tree 
37980 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43  cells. Array szC
37990 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ell .** contains
379a0 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   the size in byt
379b0 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20  es of each such 
379c0 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
379d0 69 6f 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a 20  ion adds the.** 
379e0 73 70 61 63 65 20 61 73 73 6f 63 69 61 74 65 64  space associated
379f0 20 77 69 74 68 20 65 61 63 68 20 63 65 6c 6c 20   with each cell 
37a00 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 68 61  in the array tha
37a10 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73  t is currently s
37a20 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e  tored .** within
37a30 20 74 68 65 20 62 6f 64 79 20 6f 66 20 70 50 67   the body of pPg
37a40 20 74 6f 20 74 68 65 20 70 50 67 20 66 72 65 65   to the pPg free
37a50 2d 6c 69 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d  -list. The cell-
37a60 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 6f 74 68  pointers and oth
37a70 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20  er.** fields of 
37a80 74 68 65 20 70 61 67 65 20 61 72 65 20 6e 6f 74  the page are not
37a90 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
37aa0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
37ab0 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20  turns the total 
37ac0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
37ad0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
37ae0 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e-list..*/.stati
37af0 63 20 69 6e 74 20 70 61 67 65 46 72 65 65 41 72  c int pageFreeAr
37b00 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ray(.  MemPage *
37b10 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
37b20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
37b30 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20  o edit */.  int 
37b40 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20  iFirst,         
37b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
37b60 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 64 65 6c  irst cell to del
37b70 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ete */.  int nCe
37b80 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
37b90 20 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c           /* Cell
37ba0 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
37bb0 20 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72   CellArray *pCAr
37bc0 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ray             
37bd0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
37be0 6c 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20  ls */.){.  u8 * 
37bf0 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
37c00 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a  g->aData;.  u8 *
37c10 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61   const pEnd = &a
37c20 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75  Data[pPg->pBt->u
37c30 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38  sableSize];.  u8
37c40 20 2a 20 63 6f 6e 73 74 20 70 53 74 61 72 74 20   * const pStart 
37c50 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 68 64  = &aData[pPg->hd
37c60 72 4f 66 66 73 65 74 20 2b 20 38 20 2b 20 70 50  rOffset + 8 + pP
37c70 67 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  g->childPtrSize]
37c80 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d 20 30  ;.  int nRet = 0
37c90 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
37ca0 20 69 45 6e 64 20 3d 20 69 46 69 72 73 74 20 2b   iEnd = iFirst +
37cb0 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 70 46   nCell;.  u8 *pF
37cc0 72 65 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73  ree = 0;.  int s
37cd0 7a 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f  zFree = 0;..  fo
37ce0 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45  r(i=iFirst; i<iE
37cf0 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  nd; i++){.    u8
37d00 20 2a 70 43 65 6c 6c 20 3d 20 70 43 41 72 72 61   *pCell = pCArra
37d10 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20  y->apCell[i];.  
37d20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 53 74    if( pCell>=pSt
37d30 61 72 74 20 26 26 20 70 43 65 6c 6c 3c 70 45 6e  art && pCell<pEn
37d40 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  d ){.      int s
37d50 7a 3b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6e  z;.      /* No n
37d60 65 65 64 20 74 6f 20 75 73 65 20 63 61 63 68 65  eed to use cache
37d70 64 43 65 6c 6c 53 69 7a 65 28 29 20 68 65 72 65  dCellSize() here
37d80 2e 20 20 54 68 65 20 73 69 7a 65 73 20 6f 66 20  .  The sizes of 
37d90 61 6c 6c 20 63 65 6c 6c 73 20 74 68 61 74 0a 20  all cells that. 
37da0 20 20 20 20 20 2a 2a 20 61 72 65 20 74 6f 20 62       ** are to b
37db0 65 20 66 72 65 65 64 20 68 61 76 65 20 61 6c 72  e freed have alr
37dc0 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 70 75 74  eady been comput
37dd0 69 6e 67 20 77 68 69 6c 65 20 64 65 63 69 64 69  ing while decidi
37de0 6e 67 20 77 68 69 63 68 0a 20 20 20 20 20 20 2a  ng which.      *
37df0 2a 20 63 65 6c 6c 73 20 6e 65 65 64 20 66 72 65  * cells need fre
37e00 65 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 7a  eing */.      sz
37e10 20 3d 20 70 43 41 72 72 61 79 2d 3e 73 7a 43 65   = pCArray->szCe
37e20 6c 6c 5b 69 5d 3b 20 20 61 73 73 65 72 74 28 20  ll[i];  assert( 
37e30 73 7a 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66  sz>0 );.      if
37e40 28 20 70 46 72 65 65 21 3d 28 70 43 65 6c 6c 20  ( pFree!=(pCell 
37e50 2b 20 73 7a 29 20 29 7b 0a 20 20 20 20 20 20 20  + sz) ){.       
37e60 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20   if( pFree ){.  
37e70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
37e80 70 46 72 65 65 3e 61 44 61 74 61 20 26 26 20 28  pFree>aData && (
37e90 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c 36  pFree - aData)<6
37ea0 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 20 20  5536 );.        
37eb0 20 20 66 72 65 65 53 70 61 63 65 28 70 50 67 2c    freeSpace(pPg,
37ec0 20 28 75 31 36 29 28 70 46 72 65 65 20 2d 20 61   (u16)(pFree - a
37ed0 44 61 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a  Data), szFree);.
37ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37ef0 20 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b    pFree = pCell;
37f00 0a 20 20 20 20 20 20 20 20 73 7a 46 72 65 65 20  .        szFree 
37f10 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 69 66  = sz;.        if
37f20 28 20 70 46 72 65 65 2b 73 7a 3e 70 45 6e 64 20  ( pFree+sz>pEnd 
37f30 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
37f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37f50 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a   pFree = pCell;.
37f60 20 20 20 20 20 20 20 20 73 7a 46 72 65 65 20 2b          szFree +
37f70 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = sz;.      }.  
37f80 20 20 20 20 6e 52 65 74 2b 2b 3b 0a 20 20 20 20      nRet++;.    
37f90 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 72 65  }.  }.  if( pFre
37fa0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
37fb0 20 70 46 72 65 65 3e 61 44 61 74 61 20 26 26 20   pFree>aData && 
37fc0 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 3c  (pFree - aData)<
37fd0 36 35 35 33 36 20 29 3b 0a 20 20 20 20 66 72 65  65536 );.    fre
37fe0 65 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36  eSpace(pPg, (u16
37ff0 29 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29  )(pFree - aData)
38000 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 7d 0a 20  , szFree);.  }. 
38010 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a   return nRet;.}.
38020 0a 2f 2a 0a 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20  ./*.** apCell[] 
38030 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e  and szCell[] con
38040 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74  tains pointers t
38050 6f 20 61 6e 64 20 73 69 7a 65 73 20 6f 66 20 61  o and sizes of a
38060 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 0a  ll cells in the.
38070 2a 2a 20 70 61 67 65 73 20 62 65 69 6e 67 20 62  ** pages being b
38080 61 6c 61 6e 63 65 64 2e 20 20 54 68 65 20 63 75  alanced.  The cu
38090 72 72 65 6e 74 20 70 61 67 65 2c 20 70 50 67 2c  rrent page, pPg,
380a0 20 68 61 73 20 70 50 67 2d 3e 6e 43 65 6c 6c 20   has pPg->nCell 
380b0 63 65 6c 6c 73 20 73 74 61 72 74 69 6e 67 0a 2a  cells starting.*
380c0 2a 20 77 69 74 68 20 61 70 43 65 6c 6c 5b 69 4f  * with apCell[iO
380d0 6c 64 5d 2e 20 20 41 66 74 65 72 20 62 61 6c 61  ld].  After bala
380e0 6e 63 69 6e 67 2c 20 74 68 69 73 20 70 61 67 65  ncing, this page
380f0 20 73 68 6f 75 6c 64 20 68 6f 6c 64 20 6e 4e 65   should hold nNe
38100 77 20 63 65 6c 6c 73 0a 2a 2a 20 73 74 61 72 74  w cells.** start
38110 69 6e 67 20 61 74 20 61 70 43 65 6c 6c 5b 69 4e  ing at apCell[iN
38120 65 77 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ew]..**.** This 
38130 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74 68  routine makes th
38140 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75  e necessary adju
38150 73 74 6d 65 6e 74 73 20 74 6f 20 70 50 67 20 73  stments to pPg s
38160 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69  o that it contai
38170 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ns.** the correc
38180 74 20 63 65 6c 6c 73 20 61 66 74 65 72 20 62 65  t cells after be
38190 69 6e 67 20 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  ing balanced..**
381a0 0a 2a 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72  .** The pPg->nFr
381b0 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61  ee field is inva
381c0 6c 69 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  lid when this fu
381d0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
381e0 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 72 65 73  It is the.** res
381f0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
38200 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74  he caller to set
38210 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a   it correctly..*
38220 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 64 69  /.static int edi
38230 74 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  tPage(.  MemPage
38240 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
38250 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74           /* Edit
38260 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
38270 69 6e 74 20 69 4f 6c 64 2c 20 20 20 20 20 20 20  int iOld,       
38280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38290 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
382a0 74 20 63 65 6c 6c 20 63 75 72 72 65 6e 74 6c 79  t cell currently
382b0 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e   on page */.  in
382c0 74 20 69 4e 65 77 2c 20 20 20 20 20 20 20 20 20  t iNew,         
382d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
382e0 20 49 6e 64 65 78 20 6f 66 20 6e 65 77 20 66 69   Index of new fi
382f0 72 73 74 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  rst cell on page
38300 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20   */.  int nNew, 
38310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38320 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e        /* Final n
38330 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
38340 6e 20 70 61 67 65 20 2a 2f 0a 20 20 43 65 6c 6c  n page */.  Cell
38350 41 72 72 61 79 20 2a 70 43 41 72 72 61 79 20 20  Array *pCArray  
38360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
38370 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 61 6e  rray of cells an
38380 64 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20  d sizes */.){.  
38390 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61  u8 * const aData
383a0 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20   = pPg->aData;. 
383b0 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
383c0 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
383d0 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 20 3d 20  .  u8 *pBegin = 
383e0 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e  &pPg->aCellIdx[n
383f0 4e 65 77 20 2a 20 32 5d 3b 0a 20 20 69 6e 74 20  New * 2];.  int 
38400 6e 43 65 6c 6c 20 3d 20 70 50 67 2d 3e 6e 43 65  nCell = pPg->nCe
38410 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 65 6c  ll;       /* Cel
38420 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 70 50 67  ls stored on pPg
38430 20 2a 2f 0a 20 20 75 38 20 2a 70 44 61 74 61 3b   */.  u8 *pData;
38440 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 7