/ Hex Artifact Content
Login

Artifact 7401bcbdabd87360351953e5009530c47e4fb305:


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 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 34 35 37 20 32 30 30 38 2f 30  c,v 1.457 2008/0
0190: 35 2f 30 37 20 31 39 3a 31 31 3a 30 33 20 64 61  5/07 19:11:03 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0340: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0350: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0360: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0370: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0380: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  */.#if SQLITE_TE
0390: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  ST.int sqlite3Bt
03a0: 72 65 65 54 72 61 63 65 3d 30 3b 20 20 2f 2a 20  reeTrace=0;  /* 
03b0: 54 72 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74  True to enable t
03c0: 72 61 63 69 6e 67 20 2a 2f 0a 23 65 6e 64 69 66  racing */.#endif
03d0: 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ....#ifndef SQLI
03e0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
03f0: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 66 6c 61  ACHE./*.** A fla
0400: 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  g to indicate wh
0410: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 68 61  ether or not sha
0420: 72 65 64 20 63 61 63 68 65 20 69 73 20 65 6e 61  red cache is ena
0430: 62 6c 65 64 2e 20 20 41 6c 73 6f 2c 0a 2a 2a 20  bled.  Also,.** 
0440: 61 20 6c 69 73 74 20 6f 66 20 42 74 53 68 61 72  a list of BtShar
0450: 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  ed objects that 
0460: 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66 6f 72  are eligible for
0470: 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e 0a 2a   participation.*
0480: 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  * in shared cach
0490: 65 2e 20 20 54 68 65 20 76 61 72 69 61 62 6c 65  e.  The variable
04a0: 73 20 68 61 76 65 20 66 69 6c 65 20 73 63 6f 70  s have file scop
04b0: 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c 20  e during normal 
04c0: 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20 74  builds,.** but t
04d0: 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73 20  he test harness 
04e0: 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73 20  needs to access 
04f0: 74 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  these variables 
0500: 73 6f 20 77 65 20 6d 61 6b 65 20 74 68 65 6d 0a  so we make them.
0510: 2a 2a 20 67 6c 6f 62 61 6c 20 66 6f 72 20 74 65  ** global for te
0520: 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  st builds..*/.#i
0530: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
0540: 0a 42 74 53 68 61 72 65 64 20 2a 73 71 6c 69 74  .BtShared *sqlit
0550: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0560: 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
0570: 65 33 53 68 61 72 65 64 43 61 63 68 65 45 6e 61  e3SharedCacheEna
0580: 62 6c 65 64 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  bled = 0;.#else.
0590: 73 74 61 74 69 63 20 42 74 53 68 61 72 65 64 20  static BtShared 
05a0: 2a 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  *sqlite3SharedCa
05b0: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 73 74 61  cheList = 0;.sta
05c0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 53  tic int sqlite3S
05d0: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
05e0: 64 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65  d = 0;.#endif.#e
05f0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
0600: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0610: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
0620: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0630: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  CACHE./*.** Enab
0640: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
0650: 65 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61  e shared pager a
0660: 6e 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72  nd schema featur
0670: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
0680: 6f 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66  outine has no ef
0690: 66 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67  fect on existing
06a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
06b0: 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68  tions..** The sh
06c0: 61 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69  ared cache setti
06d0: 6e 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20  ng effects only 
06e0: 66 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a  future calls to.
06f0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
0700: 29 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  ), sqlite3_open1
0710: 36 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f  6(), or sqlite3_
0720: 6f 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e  open_v2()..*/.in
0730: 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  t sqlite3_enable
0740: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e  _shared_cache(in
0750: 74 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c  t enable){.  sql
0760: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 45  ite3SharedCacheE
0770: 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b  nabled = enable;
0780: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
0790: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  _OK;.}.#endif...
07a0: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
07b0: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
07c0: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61  tic int checkRea
07d0: 64 4c 6f 63 6b 73 28 42 74 72 65 65 2a 2c 50 67  dLocks(Btree*,Pg
07e0: 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a  no,BtCursor*);..
07f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
0800: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0810: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  /*.  ** The f
0820: 75 6e 63 74 69 6f 6e 73 20 71 75 65 72 79 54 61  unctions queryTa
0830: 62 6c 65 4c 6f 63 6b 28 29 2c 20 6c 6f 63 6b 54  bleLock(), lockT
0840: 61 62 6c 65 28 29 20 61 6e 64 20 75 6e 6c 6f 63  able() and unloc
0850: 6b 41 6c 6c 54 61 62 6c 65 73 28 29 0a 20 20 2a  kAllTables().  *
0860: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0870: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0880: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0890: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
08a0: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
08b0: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
08c0: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
08d0: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
08e0: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
08f0: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0900: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0910: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0920: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0930: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0940: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0950: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0960: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0970: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0980: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0990: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
09a0: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
09b0: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
09c0: 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62  eryTableLock(a,b
09d0: 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ,c) SQLITE_OK.  
09e0: 23 64 65 66 69 6e 65 20 6c 6f 63 6b 54 61 62 6c  #define lockTabl
09f0: 65 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f  e(a,b,c) SQLITE_
0a00: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 6c  OK.  #define unl
0a10: 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 61 29 0a  ockAllTables(a).
0a20: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
0a30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0a40: 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 51  ED_CACHE./*.** Q
0a50: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 62  uery to see if b
0a60: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
0a70: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
0a80: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
0a90: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
0aa0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
0ab0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
0ac0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
0ad0: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
0ae0: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
0af0: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
0b00: 79 20 63 61 6c 6c 69 6e 67 20 6c 6f 63 6b 54 61  y calling lockTa
0b10: 62 6c 65 28 29 29 2c 20 6f 72 0a 2a 2a 20 53 51  ble()), or.** SQ
0b20: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
0b30: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
0b40: 74 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b  t queryTableLock
0b50: 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
0b60: 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  iTab, u8 eLock){
0b70: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
0b80: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
0b90: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
0ba0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
0bb0: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
0bc0: 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73   );.  .  /* This
0bd0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
0be0: 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  he shared-cache 
0bf0: 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a  is not enabled *
0c00: 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72  /.  if( !p->shar
0c10: 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75  able ){.    retu
0c20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
0c30: 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20  }..  /* If some 
0c40: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
0c50: 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65   is holding an e
0c60: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74  xclusive lock, t
0c70: 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  he.  ** requeste
0c80: 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62  d lock may not b
0c90: 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f  e obtained..  */
0ca0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 45 78 63  .  if( pBt->pExc
0cb0: 6c 75 73 69 76 65 20 26 26 20 70 42 74 2d 3e 70  lusive && pBt->p
0cc0: 45 78 63 6c 75 73 69 76 65 21 3d 70 20 29 7b 0a  Exclusive!=p ){.
0cd0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
0ce0: 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20  E_LOCKED;.  }.. 
0cf0: 20 2f 2a 20 54 68 69 73 20 28 61 6c 6f 6e 67 20   /* This (along 
0d00: 77 69 74 68 20 6c 6f 63 6b 54 61 62 6c 65 28 29  with lockTable()
0d10: 29 20 69 73 20 77 68 65 72 65 20 74 68 65 20 52  ) is where the R
0d20: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66  eadUncommitted f
0d30: 6c 61 67 20 69 73 0a 20 20 2a 2a 20 64 65 61 6c  lag is.  ** deal
0d40: 74 20 77 69 74 68 2e 20 49 66 20 74 68 65 20 63  t with. If the c
0d50: 61 6c 6c 65 72 20 69 73 20 71 75 65 72 79 69 6e  aller is queryin
0d60: 67 20 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f 63  g for a read-loc
0d70: 6b 20 61 6e 64 20 74 68 65 20 66 6c 61 67 20 69  k and the flag i
0d80: 73 0a 20 20 2a 2a 20 73 65 74 2c 20 69 74 20 69  s.  ** set, it i
0d90: 73 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c  s unconditionall
0da0: 79 20 67 72 61 6e 74 65 64 20 2d 20 65 76 65 6e  y granted - even
0db0: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 77 72   if there are wr
0dc0: 69 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a 2a 20 6f  ite-locks.  ** o
0dd0: 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 49 66 20  n the table. If 
0de0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20  a write-lock is 
0df0: 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 20 52  requested, the R
0e00: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66  eadUncommitted f
0e10: 6c 61 67 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  lag.  ** is not 
0e20: 63 6f 6e 73 69 64 65 72 65 64 2e 0a 20 20 2a 2a  considered..  **
0e30: 0a 20 20 2a 2a 20 49 6e 20 66 75 6e 63 74 69 6f  .  ** In functio
0e40: 6e 20 6c 6f 63 6b 54 61 62 6c 65 28 29 2c 20 69  n lockTable(), i
0e50: 66 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73  f a read-lock is
0e60: 20 64 65 6d 61 6e 64 65 64 20 61 6e 64 20 74 68   demanded and th
0e70: 65 20 0a 20 20 2a 2a 20 52 65 61 64 55 6e 63 6f  e .  ** ReadUnco
0e80: 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20  mmitted flag is 
0e90: 73 65 74 2c 20 6e 6f 20 65 6e 74 72 79 20 69 73  set, no entry is
0ea0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 6f   added to the lo
0eb0: 63 6b 73 20 6c 69 73 74 20 0a 20 20 2a 2a 20 28  cks list .  ** (
0ec0: 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 29 2e  BtShared.pLock).
0ed0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73 75  .  **.  ** To su
0ee0: 6d 6d 61 72 69 7a 65 3a 20 49 66 20 74 68 65 20  mmarize: If the 
0ef0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20  ReadUncommitted 
0f00: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
0f10: 6e 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 64  n read cursors d
0f20: 6f 0a 20 20 2a 2a 20 6e 6f 74 20 63 72 65 61 74  o.  ** not creat
0f30: 65 20 6f 72 20 72 65 73 70 65 63 74 20 74 61 62  e or respect tab
0f40: 6c 65 20 6c 6f 63 6b 73 2e 20 54 68 65 20 6c 6f  le locks. The lo
0f50: 63 6b 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  cking procedure 
0f60: 66 6f 72 20 61 20 0a 20 20 2a 2a 20 77 72 69 74  for a .  ** writ
0f70: 65 2d 63 75 72 73 6f 72 20 64 6f 65 73 20 6e 6f  e-cursor does no
0f80: 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
0f90: 20 69 66 28 20 0a 20 20 20 20 21 70 2d 3e 64 62   if( .    !p->db
0fa0: 20 7c 7c 20 0a 20 20 20 20 30 3d 3d 28 70 2d 3e   || .    0==(p->
0fb0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
0fc0: 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64  _ReadUncommitted
0fd0: 29 20 7c 7c 20 0a 20 20 20 20 65 4c 6f 63 6b 3d  ) || .    eLock=
0fe0: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 0a 20  =WRITE_LOCK ||. 
0ff0: 20 20 20 69 54 61 62 3d 3d 4d 41 53 54 45 52 5f     iTab==MASTER_
1000: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 66 6f  ROOT.  ){.    fo
1010: 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
1020: 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
1030: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
1040: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
1050: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
1060: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
1070: 62 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  b && .          
1080: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
1090: 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63 6b 21 3d 52  Lock || eLock!=R
10a0: 45 41 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  EAD_LOCK) ){.   
10b0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10c0: 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  TE_LOCKED;.     
10d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
10e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10f0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
1100: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1110: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
1120: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1130: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
1140: 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20  * Add a lock on 
1150: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
1160: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
1170: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
1180: 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42  ree used.** by B
1190: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50  tree handle p. P
11a0: 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d  arameter eLock m
11b0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45  ust be either RE
11c0: 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57  AD_LOCK or .** W
11d0: 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  RITE_LOCK..**.**
11e0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
11f0: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f  turned if the lo
1200: 63 6b 20 69 73 20 61 64 64 65 64 20 73 75 63 63  ck is added succ
1210: 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45  essfully. SQLITE
1220: 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 53 51 4c  _BUSY and.** SQL
1230: 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c  ITE_NOMEM may al
1240: 73 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a  so be returned..
1250: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
1260: 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  ckTable(Btree *p
1270: 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75  , Pgno iTable, u
1280: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
1290: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
12a0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  Bt;.  BtLock *pL
12b0: 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63  ock = 0;.  BtLoc
12c0: 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73  k *pIter;..  ass
12d0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
12e0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
12f0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  ;..  /* This is 
1300: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73  a no-op if the s
1310: 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e  hared-cache is n
1320: 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  ot enabled */.  
1330: 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65  if( !p->sharable
1340: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1350: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1360: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
1370: 4f 4b 3d 3d 71 75 65 72 79 54 61 62 6c 65 4c 6f  OK==queryTableLo
1380: 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c  ck(p, iTable, eL
1390: 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ock) );..  /* If
13a0: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
13b0: 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73 65  itted flag is se
13c0: 74 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  t and a read-loc
13d0: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 0a  k is requested,.
13e0: 20 20 2a 2a 20 72 65 74 75 72 6e 20 65 61 72 6c    ** return earl
13f0: 79 20 77 69 74 68 6f 75 74 20 61 64 64 69 6e 67  y without adding
1400: 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
1410: 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20   BtShared.pLock 
1420: 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a 2a 20 63  list. See.  ** c
1430: 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e 63 74 69  omment in functi
1440: 6f 6e 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  on queryTableLoc
1450: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66  k() for more inf
1460: 6f 20 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 0a 20  o on handling . 
1470: 20 2a 2a 20 74 68 65 20 52 65 61 64 55 6e 63 6f   ** the ReadUnco
1480: 6d 6d 69 74 74 65 64 20 66 6c 61 67 2e 0a 20 20  mmitted flag..  
1490: 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 70  */.  if( .    (p
14a0: 2d 3e 64 62 29 20 26 26 20 0a 20 20 20 20 28 70  ->db) && .    (p
14b0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
14c0: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
14d0: 65 64 29 20 26 26 20 0a 20 20 20 20 28 65 4c 6f  ed) && .    (eLo
14e0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 26  ck==READ_LOCK) &
14f0: 26 0a 20 20 20 20 69 54 61 62 6c 65 21 3d 4d 41  &.    iTable!=MA
1500: 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20  STER_ROOT.  ){. 
1510: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1520: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  _OK;.  }..  /* F
1530: 69 72 73 74 20 73 65 61 72 63 68 20 74 68 65 20  irst search the 
1540: 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73  list for an exis
1550: 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69  ting lock on thi
1560: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
1570: 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
1580: 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
1590: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
15a0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
15b0: 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26  Table==iTable &&
15c0: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d   pIter->pBtree==
15d0: 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  p ){.      pLock
15e0: 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20   = pIter;.      
15f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1600: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62  ..  /* If the ab
1610: 6f 76 65 20 73 65 61 72 63 68 20 64 69 64 20 6e  ove search did n
1620: 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b  ot find a BtLock
1630: 20 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 74   struct associat
1640: 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a  ing Btree p.  **
1650: 20 77 69 74 68 20 74 61 62 6c 65 20 69 54 61 62   with table iTab
1660: 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65  le, allocate one
1670: 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74   and link it int
1680: 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f  o the list..  */
1690: 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b  .  if( !pLock ){
16a0: 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74  .    pLock = (Bt
16b0: 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61  Lock *)sqlite3Ma
16c0: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
16d0: 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66  BtLock));.    if
16e0: 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( !pLock ){.    
16f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1700: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
1710: 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d   pLock->iTable =
1720: 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f   iTable;.    pLo
1730: 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a  ck->pBtree = p;.
1740: 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74      pLock->pNext
1750: 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
1760: 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20     pBt->pLock = 
1770: 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pLock;.  }..  /*
1780: 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e   Set the BtLock.
1790: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
17a0: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  o the maximum of
17b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
17c0: 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72  k.  ** and the r
17d0: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54  equested lock. T
17e0: 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77  his means if a w
17f0: 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c  rite-lock was al
1800: 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20  ready held.  ** 
1810: 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  and a read-lock 
1820: 72 65 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f  requested, we do
1830: 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20  n't incorrectly 
1840: 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f  downgrade the lo
1850: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ck..  */.  asser
1860: 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45  t( WRITE_LOCK>RE
1870: 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  AD_LOCK );.  if(
1880: 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c   eLock>pLock->eL
1890: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
18a0: 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b  ->eLock = eLock;
18b0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
18c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
18d0: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
18e0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
18f0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
1900: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1910: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ACHE./*.** Relea
1920: 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65  se all the table
1930: 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62   locks (locks ob
1940: 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73  tained via calls
1950: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 54 61 62 6c   to the lockTabl
1960: 65 28 29 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65  e().** procedure
1970: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
1980: 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a 73 74 61  handle p..*/.sta
1990: 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 41  tic void unlockA
19a0: 6c 6c 54 61 62 6c 65 73 28 42 74 72 65 65 20 2a  llTables(Btree *
19b0: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
19c0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
19d0: 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20  BtLock **ppIter 
19e0: 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a  = &pBt->pLock;..
19f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a00: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1a10: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
1a20: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20   p->sharable || 
1a30: 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 0a 20  0==*ppIter );.. 
1a40: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
1a50: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
1a60: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
1a70: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1a80: 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  >pExclusive==0 |
1a90: 7c 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76  | pBt->pExclusiv
1aa0: 65 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  e==pLock->pBtree
1ab0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63   );.    if( pLoc
1ac0: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  k->pBtree==p ){.
1ad0: 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20        *ppIter = 
1ae0: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
1af0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1b00: 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c  (pLock);.    }el
1b10: 73 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72  se{.      ppIter
1b20: 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74   = &pLock->pNext
1b30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1b40: 66 28 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69  f( pBt->pExclusi
1b50: 76 65 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74  ve==p ){.    pBt
1b60: 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 3d 20 30  ->pExclusive = 0
1b70: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
1b80: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
1b90: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
1ba0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
1bb0: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
1bc0: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
1bd0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
1be0: 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  ../*.** Verify t
1bf0: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
1c00: 6f 6c 64 73 20 61 20 6d 75 74 65 78 20 6f 6e 20  olds a mutex on 
1c10: 74 68 65 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a  the BtShared.*/.
1c20: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
1c30: 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72  tatic int cursor
1c40: 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72  HoldsMutex(BtCur
1c50: 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  sor *p){.  retur
1c60: 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  n sqlite3_mutex_
1c70: 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74  held(p->pBt->mut
1c80: 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ex);.}.#endif...
1c90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ca0: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a  MIT_INCRBLOB./*.
1cb0: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
1cc0: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
1cd0: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 63  list cache for c
1ce0: 75 72 73 6f 72 20 70 43 75 72 2c 20 69 66 20 61  ursor pCur, if a
1cf0: 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ny..*/.static vo
1d00: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  id invalidateOve
1d10: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 43 75 72  rflowCache(BtCur
1d20: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
1d30: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1d40: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1d50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1d60: 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b  Cur->aOverflow);
1d70: 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  .  pCur->aOverfl
1d80: 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ow = 0;.}../*.**
1d90: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
1da0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1db0: 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c  st cache for all
1dc0: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a   cursors opened.
1dd0: 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  ** on the shared
1de0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
1df0: 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pBt..*/.static 
1e00: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41  void invalidateA
1e10: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
1e20: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1e30: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1e40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1e50: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1e60: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
1e70: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
1e80: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
1e90: 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  .    invalidateO
1ea0: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b  verflowCache(p);
1eb0: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23  .  }.}.#else.  #
1ec0: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
1ed0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78  eOverflowCache(x
1ee0: 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  ).  #define inva
1ef0: 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
1f00: 77 43 61 63 68 65 28 78 29 0a 23 65 6e 64 69 66  wCache(x).#endif
1f10: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
1f20: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
1f30: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
1f40: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
1f50: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
1f60: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
1f70: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
1f80: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
1f90: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
1fa0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
1fb0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
1fc0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1fd0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
1fe0: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
1ff0: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2000: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  e );.  assert( 0
2010: 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a  ==pCur->pKey );.
2020: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2030: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2040: 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
2050: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
2060: 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65  pCur, &pCur->nKe
2070: 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  y);..  /* If thi
2080: 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74  s is an intKey t
2090: 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61  able, then the a
20a0: 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72  bove call to Btr
20b0: 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a  eeKeySize().  **
20c0: 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65   stores the inte
20d0: 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d  ger key in pCur-
20e0: 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63  >nKey. In this c
20f0: 61 73 65 20 74 68 69 73 20 76 61 6c 75 65 20 69  ase this value i
2100: 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20  s.  ** all that 
2110: 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68  is required. Oth
2120: 65 72 77 69 73 65 2c 20 69 66 20 70 43 75 72 20  erwise, if pCur 
2130: 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61  is not open on a
2140: 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61  n intKey.  ** ta
2150: 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63  ble, then malloc
2160: 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73   space for and s
2170: 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e  tore the pCur->n
2180: 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79  Key bytes of key
2190: 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a   .  ** data..  *
21a0: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
21b0: 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72  TE_OK && 0==pCur
21c0: 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 29  ->pPage->intKey)
21d0: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
21e0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
21f0: 63 28 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20  c(pCur->nKey);. 
2200: 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20     if( pKey ){. 
2210: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2220: 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
2230: 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70  0, pCur->nKey, p
2240: 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
2250: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2260: 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  .        pCur->p
2270: 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Key = pKey;.    
2280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2290: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b   sqlite3_free(pK
22a0: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
22b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
22c0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
22d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
22e0: 65 72 74 28 20 21 70 43 75 72 2d 3e 70 50 61 67  ert( !pCur->pPag
22f0: 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  e->intKey || !pC
2300: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
2310: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2320: 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
2330: 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
2340: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67  ;.    pCur->pPag
2350: 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
2360: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2370: 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20  _REQUIRESEEK;.  
2380: 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  }..  invalidateO
2390: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
23a0: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
23b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  .}../*.** Save t
23c0: 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
23d0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65  all cursors exce
23e0: 70 74 20 70 45 78 63 65 70 74 20 6f 70 65 6e 20  pt pExcept open 
23f0: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a  on the table .**
2400: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2410: 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20  iRoot. Usually, 
2420: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a  this is called j
2430: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
2440: 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20  r.** pExcept is 
2450: 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74  used to modify t
2460: 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44  he table (BtreeD
2470: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
2480: 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74  Insert())..*/.st
2490: 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c  atic int saveAll
24a0: 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
24b0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f   *pBt, Pgno iRoo
24c0: 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
24d0: 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  cept){.  BtCurso
24e0: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
24f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2500: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2510: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63  ;.  assert( pExc
2520: 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70  ept==0 || pExcep
2530: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
2540: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
2550: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
2560: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
2570: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
2580: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
2590: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a  oot==iRoot) && .
25a0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
25b0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
25c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
25d0: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
25e0: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69  tion(p);.      i
25f0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
2600: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2610: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2620: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2630: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2640: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
2650: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
2660: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  osition..*/.stat
2670: 69 63 20 76 6f 69 64 20 63 6c 65 61 72 43 75 72  ic void clearCur
2680: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75  sorPosition(BtCu
2690: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
26a0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
26b0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
26c0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
26d0: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
26e0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
26f0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2700: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2710: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
2720: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2730: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
2740: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
2750: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
2760: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
2770: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
2780: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
2790: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
27a0: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
27b0: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
27c0: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
27d0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
27e0: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
27f0: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
2800: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
2810: 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
2820: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
2830: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
2840: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
2850: 6f 6e 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  on()..**.** If t
2860: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2870: 6e 74 20 61 72 67 75 6d 65 6e 74 20 2d 20 64 6f  nt argument - do
2880: 53 65 65 6b 20 2d 20 69 73 20 66 61 6c 73 65 2c  Seek - is false,
2890: 20 74 68 65 6e 20 69 6e 73 74 65 61 64 20 6f 66   then instead of
28a0: 20 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 20 74   .** returning t
28b0: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73  he cursor to its
28c0: 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 2c   saved position,
28d0: 20 61 6e 79 20 73 61 76 65 64 20 70 6f 73 69 74   any saved posit
28e0: 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 0a 2a  ion is deleted.*
28f0: 2a 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  * and the cursor
2900: 20 73 74 61 74 65 20 73 65 74 20 74 6f 20 43 55   state set to CU
2910: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 0a 2a 2f  RSOR_INVALID..*/
2920: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2930: 65 52 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43  eRestoreOrClearC
2940: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
2950: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2960: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
2970: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2980: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2990: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29a0: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
29b0: 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
29c0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29d0: 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
29e0: 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
29f0: 73 6b 69 70 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  skip;.  }.#ifnde
2a00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
2a10: 43 52 42 4c 4f 42 0a 20 20 69 66 28 20 70 43 75  CRBLOB.  if( pCu
2a20: 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  r->isIncrblobHan
2a30: 64 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  dle ){.    retur
2a40: 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
2a50: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 43 75    }.#endif.  pCu
2a60: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2a70: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63  OR_INVALID;.  rc
2a80: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
2a90: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
2aa0: 2d 3e 70 4b 65 79 2c 20 30 2c 20 70 43 75 72 2d  ->pKey, 0, pCur-
2ab0: 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d  >nKey, 0, &pCur-
2ac0: 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63  >skip);.  if( rc
2ad0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2ae0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2af0: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20  pCur->pKey);.   
2b00: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
2b10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2b20: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2b30: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2b40: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2b50: 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20  INVALID );.  }. 
2b60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
2b70: 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 4f 72  define restoreOr
2b80: 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
2b90: 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65  ion(p) \.  (p->e
2ba0: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
2bb0: 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20  QUIRESEEK ? \.  
2bc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
2bd0: 72 65 65 52 65 73 74 6f 72 65 4f 72 43 6c 65 61  reeRestoreOrClea
2be0: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
2bf0: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
2c00: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 23 69 66 6e  SQLITE_OK)..#ifn
2c10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c20: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
2c30: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
2c40: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
2c50: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
2c60: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
2c70: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
2c80: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
2c90: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
2ca0: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
2cb0: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
2cc0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  e number..*/.sta
2cd0: 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50  tic Pgno ptrmapP
2ce0: 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a  ageno(BtShared *
2cf0: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
2d00: 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72  .  int nPagesPer
2d10: 4d 61 70 50 61 67 65 2c 20 69 50 74 72 4d 61 70  MapPage, iPtrMap
2d20: 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28  , ret;.  assert(
2d30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2d40: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2d50: 29 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61  );.  nPagesPerMa
2d60: 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73  pPage = (pBt->us
2d70: 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20  ableSize/5)+1;. 
2d80: 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f   iPtrMap = (pgno
2d90: 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70  -2)/nPagesPerMap
2da0: 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69  Page;.  ret = (i
2db0: 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72  PtrMap*nPagesPer
2dc0: 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20  MapPage) + 2; . 
2dd0: 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e   if( ret==PENDIN
2de0: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2df0: 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20   ){.    ret++;. 
2e00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
2e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
2e20: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
2e30: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
2e40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2e50: 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f  e updates the po
2e60: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
2e70: 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
2e80: 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74  'key'.** so that
2e90: 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65   it maps to type
2ea0: 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72   'eType' and par
2eb0: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
2ec0: 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72  'pgno'..** An er
2ed0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2ee0: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
2ef0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
2f00: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
2f10: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
2f20: 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61   ptrmapPut(BtSha
2f30: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
2f40: 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67  ey, u8 eType, Pg
2f50: 6e 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20 44 62  no parent){.  Db
2f60: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
2f70: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
2f80: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
2f90: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
2fa0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
2fb0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
2fc0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
2fd0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
2fe0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
2ff0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
3000: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
3010: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
3020: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  e */.  int rc;..
3030: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3040: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3050: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
3060: 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   The master-jour
3070: 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  nal page number 
3080: 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73  must never be us
3090: 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20  ed as a pointer 
30a0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
30b0: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
30c0: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
30d0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
30e0: 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  t)) );..  assert
30f0: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
3100: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
3110: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3120: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
3130: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  KPT;.  }.  iPtrm
3140: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
3150: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
3160: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
3170: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
3180: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
3190: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
31a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
31c0: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
31d0: 50 5f 50 54 52 4f 46 46 53 45 54 28 70 42 74 2c  P_PTROFFSET(pBt,
31e0: 20 6b 65 79 29 3b 0a 20 20 70 50 74 72 6d 61 70   key);.  pPtrmap
31f0: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
3200: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
3210: 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54  Page);..  if( eT
3220: 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66  ype!=pPtrmap[off
3230: 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65  set] || get4byte
3240: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
3250: 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a  +1])!=parent ){.
3260: 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52 4d      TRACE(("PTRM
3270: 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28  AP_UPDATE: %d->(
3280: 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20  %d,%d)\n", key, 
3290: 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b  eType, parent));
32a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
32b0: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
32c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
32d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32e0: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
32f0: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
3300: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
3310: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
3320: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
3330: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 61    }..  sqlite3Pa
3340: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
3350: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
3360: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
3370: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
3380: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
3390: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
33a0: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
33b0: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
33c0: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
33d0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
33e0: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
33f0: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
3400: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
3410: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
3420: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
3430: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
3440: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
3450: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
3460: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
3470: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
3480: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
3490: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
34a0: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
34b0: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
34c0: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
34d0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
34e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
34f0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
3500: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
3510: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
3520: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
3530: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
3540: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
3550: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
3560: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
3570: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
3580: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
3590: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
35a0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
35b0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
35c0: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
35d0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
35e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35f0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
3600: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
3610: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
3620: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
3630: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
3640: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
3650: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
3660: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
3670: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
3680: 46 46 53 45 54 28 70 42 74 2c 20 6b 65 79 29 3b  FFSET(pBt, key);
3690: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
36a0: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
36b0: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
36c0: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
36d0: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
36e0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
36f0: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
3700: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
3710: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
3720: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
3730: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
3740: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
3750: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  PT;.  return SQL
3760: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
3770: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
3780: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a  _AUTOVACUUM */..
3790: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
37a0: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
37b0: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
37c0: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
37d0: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
37e0: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
37f0: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
3800: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
3810: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
3820: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
3830: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3840: 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  tine works only 
3850: 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64  for pages that d
3860: 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76  o not contain ov
3870: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
3880: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
3890: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 20  l(pPage, iCell) 
38a0: 5c 0a 20 20 28 28 70 50 61 67 65 29 2d 3e 61 44  \.  ((pPage)->aD
38b0: 61 74 61 20 2b 20 67 65 74 32 62 79 74 65 28 26  ata + get2byte(&
38c0: 28 70 50 61 67 65 29 2d 3e 61 44 61 74 61 5b 28  (pPage)->aData[(
38d0: 70 50 61 67 65 29 2d 3e 63 65 6c 6c 4f 66 66 73  pPage)->cellOffs
38e0: 65 74 2b 32 2a 28 69 43 65 6c 6c 29 5d 29 29 0a  et+2*(iCell)])).
38f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
3900: 53 54 0a 75 38 20 2a 73 71 6c 69 74 65 33 42 74  ST.u8 *sqlite3Bt
3910: 72 65 65 46 69 6e 64 43 65 6c 6c 28 4d 65 6d 50  reeFindCell(MemP
3920: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
3930: 69 43 65 6c 6c 29 7b 0a 20 20 61 73 73 65 72 74  iCell){.  assert
3940: 28 20 69 43 65 6c 6c 3e 3d 30 20 29 3b 0a 20 20  ( iCell>=0 );.  
3950: 61 73 73 65 72 74 28 20 69 43 65 6c 6c 3c 67 65  assert( iCell<ge
3960: 74 32 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t2byte(&pPage->a
3970: 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
3980: 66 66 73 65 74 2b 33 5d 29 20 29 3b 0a 20 20 72  ffset+3]) );.  r
3990: 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70  eturn findCell(p
39a0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a  Page, iCell);.}.
39b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
39c0: 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  is a more comple
39d0: 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  x version of sql
39e0: 69 74 65 33 42 74 72 65 65 46 69 6e 64 43 65 6c  ite3BtreeFindCel
39f0: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
3a00: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
3a10: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
3a20: 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65  flow cells.  See
3a30: 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69   insert.*/.stati
3a40: 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c  c u8 *findOverfl
3a50: 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  owCell(MemPage *
3a60: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
3a70: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
3a80: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
3a90: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
3aa0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3ab0: 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f   for(i=pPage->nO
3ac0: 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b  verflow-1; i>=0;
3ad0: 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b   i--){.    int k
3ae0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76  ;.    struct _Ov
3af0: 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20  flCell *pOvfl;. 
3b00: 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67     pOvfl = &pPag
3b10: 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20  e->aOvfl[i];.   
3b20: 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b   k = pOvfl->idx;
3b30: 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c  .    if( k<=iCel
3b40: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b  l ){.      if( k
3b50: 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==iCell ){.     
3b60: 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d     return pOvfl-
3b70: 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  >pCell;.      }.
3b80: 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20        iCell--;. 
3b90: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3ba0: 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  n findCell(pPage
3bb0: 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  , iCell);.}../*.
3bc0: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
3bd0: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
3be0: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
3bf0: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
3c00: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20  .  There.** are 
3c10: 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  two versions of 
3c20: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20  this function.  
3c30: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
3c40: 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20  eCell() takes a 
3c50: 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61  .** cell index a
3c60: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
3c70: 75 6d 65 6e 74 20 61 6e 64 20 73 71 6c 69 74 65  ument and sqlite
3c80: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
3c90: 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61  tr() .** takes a
3ca0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3cb0: 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  body of the cell
3cc0: 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61   as its second a
3cd0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  rgument..**.** W
3ce0: 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c  ithin this file,
3cf0: 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29   the parseCell()
3d00: 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61   macro can be ca
3d10: 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  lled instead of.
3d20: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  ** sqlite3BtreeP
3d30: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55  arseCellPtr(). U
3d40: 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c  sing some compil
3d50: 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ers, this will b
3d60: 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69  e faster..*/.voi
3d70: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
3d80: 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65  rseCellPtr(.  Me
3d90: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
3da0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
3db0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
3dc0: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
3dd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
3de0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
3df0: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
3e00: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
3e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
3e20: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
3e30: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
3e40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3e50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74     /* Number byt
3e60: 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65  es in cell conte
3e70: 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  nt header */.  u
3e80: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
3e90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3ea0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
3eb0: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
3ec0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
3ed0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
3ee0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
3ef0: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c  ..  pInfo->pCell
3f00: 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65   = pCell;.  asse
3f10: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
3f20: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
3f30: 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50  f==1 );.  n = pP
3f40: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
3f50: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  e;.  assert( n==
3f60: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  4-4*pPage->leaf 
3f70: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
3f80: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e  hasData ){.    n
3f90: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
3fa0: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c  &pCell[n], nPayl
3fb0: 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oad);.  }else{. 
3fc0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b     nPayload = 0;
3fd0: 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 44  .  }.  pInfo->nD
3fe0: 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  ata = nPayload;.
3ff0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
4000: 4b 65 79 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  Key ){.    n += 
4010: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
4020: 5b 6e 5d 2c 20 28 75 36 34 20 2a 29 26 70 49 6e  [n], (u64 *)&pIn
4030: 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c  fo->nKey);.  }el
4040: 73 65 7b 0a 20 20 20 20 75 33 32 20 78 3b 0a 20  se{.    u32 x;. 
4050: 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e     n += getVarin
4060: 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 78  t32(&pCell[n], x
4070: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b  );.    pInfo->nK
4080: 65 79 20 3d 20 78 3b 0a 20 20 20 20 6e 50 61 79  ey = x;.    nPay
4090: 6c 6f 61 64 20 2b 3d 20 78 3b 0a 20 20 7d 0a 20  load += x;.  }. 
40a0: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
40b0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
40c0: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
40d0: 6e 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  n;.  if( nPayloa
40e0: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
40f0: 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
4100: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
4110: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
4120: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
4130: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
4140: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
4150: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
4160: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
4170: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69    */.    int nSi
4180: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ze;          /* 
4190: 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65  Total size of ce
41a0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79  ll content in by
41b0: 74 65 73 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f  tes */.    pInfo
41c0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6e 50 61 79 6c  ->nLocal = nPayl
41d0: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
41e0: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
41f0: 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c     nSize = nPayl
4200: 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 69 66 28  oad + n;.    if(
4210: 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20   nSize<4 ){.    
4220: 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20    nSize = 4;    
4230: 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63      /* Minimum c
4240: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
4250: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
4260: 2d 3e 6e 53 69 7a 65 20 3d 20 6e 53 69 7a 65 3b  ->nSize = nSize;
4270: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
4280: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
4290: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
42a0: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
42b0: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
42c0: 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63  ve.    ** to dec
42d0: 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  ide how much to 
42e0: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e  store locally an
42f0: 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70  d how much to sp
4300: 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20  ill onto.    ** 
4310: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
4320: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
4330: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
4340: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
4350: 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f  d.    ** space o
4360: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  n overflow pages
4370: 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74   while keeping t
4380: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63  he amount of loc
4390: 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a  al storage.    *
43a0: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
43b0: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
43c0: 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  al..    **.    *
43d0: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
43e0: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
43f0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
4400: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
4410: 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77  any.    ** way w
4420: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
4430: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69   incompatible fi
4440: 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a  le format..    *
4450: 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  /.    int minLoc
4460: 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  al;  /* Minimum 
4470: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
4480: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
4490: 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63  /.    int maxLoc
44a0: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
44b0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
44c0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
44d0: 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75  /.    int surplu
44e0: 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  s;   /* Overflow
44f0: 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62   payload availab
4500: 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f  le for local sto
4510: 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e  rage */..    min
4520: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
4530: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78  inLocal;.    max
4540: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
4550: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72  axLocal;.    sur
4560: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
4570: 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69  + (nPayload - mi
4580: 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e  nLocal)%(pPage->
4590: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
45a0: 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20 73 75  - 4);.    if( su
45b0: 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61  rplus <= maxLoca
45c0: 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f  l ){.      pInfo
45d0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 73 75 72 70 6c  ->nLocal = surpl
45e0: 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  us;.    }else{. 
45f0: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
4600: 61 6c 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  al = minLocal;. 
4610: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
4620: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 70 49 6e 66  iOverflow = pInf
4630: 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b 0a 20  o->nLocal + n;. 
4640: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
4650: 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c  = pInfo->iOverfl
4660: 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64  ow + 4;.  }.}.#d
4670: 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28  efine parseCell(
4680: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
4690: 6e 66 6f 29 20 5c 0a 20 20 73 71 6c 69 74 65 33  nfo) \.  sqlite3
46a0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
46b0: 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43  r((pPage), findC
46c0: 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43  ell((pPage), (iC
46d0: 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a  ell)), (pInfo)).
46e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
46f0: 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65  eParseCell(.  Me
4700: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
4710: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
4720: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
4730: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
4740: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4750: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
4760: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
4770: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
4780: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
4790: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
47a0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
47b0: 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67    parseCell(pPag
47c0: 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, iCell, pInfo)
47d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
47e0: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  te the total num
47f0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61  ber of bytes tha
4800: 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69  t a Cell needs i
4810: 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  n the cell.** da
4820: 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62  ta area of the b
4830: 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20  tree-page.  The 
4840: 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e  return number in
4850: 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a  cludes the cell.
4860: 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61  ** data header a
4870: 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79  nd the local pay
4880: 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e  load, but not an
4890: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  y overflow page 
48a0: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20  or.** the space 
48b0: 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c  used by the cell
48c0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23 69 66   pointer..*/.#if
48d0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
48e0: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28  ic u16 cellSize(
48f0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
4900: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 43 65  int iCell){.  Ce
4910: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73  llInfo info;.  s
4920: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
4930: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
4940: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 65 74  l, &info);.  ret
4950: 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  urn info.nSize;.
4960: 7d 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  }.#endif.static 
4970: 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  u16 cellSizePtr(
4980: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
4990: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65  u8 *pCell){.  Ce
49a0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 73  llInfo info;.  s
49b0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
49c0: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
49d0: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
49e0: 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a  return info.nSiz
49f0: 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  e;.}..#ifndef SQ
4a00: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
4a10: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  CUUM./*.** If th
4a20: 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61  e cell pCell, pa
4a30: 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  rt of page pPage
4a40: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
4a50: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65  ter.** to an ove
4a60: 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65  rflow page, inse
4a70: 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  rt an entry into
4a80: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
4a90: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72  .** for the over
4aa0: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  flow page..*/.st
4ab0: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50  atic int ptrmapP
4ac0: 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67  utOvflPtr(MemPag
4ad0: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
4ae0: 65 6c 6c 29 7b 0a 20 20 69 66 28 20 70 43 65 6c  ell){.  if( pCel
4af0: 6c 20 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  l ){.    CellInf
4b00: 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 73 71 6c 69  o info;.    sqli
4b10: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
4b20: 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
4b30: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  l, &info);.    a
4b40: 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61  ssert( (info.nDa
4b50: 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
4b60: 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d  y?0:info.nKey))=
4b70: 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
4b80: 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e  ;.    if( (info.
4b90: 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
4ba0: 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
4bb0: 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  ))>info.nLocal )
4bc0: 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66  {.      Pgno ovf
4bd0: 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
4be0: 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
4bf0: 6f 77 5d 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ow]);.      retu
4c00: 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61  rn ptrmapPut(pPa
4c10: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
4c20: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
4c30: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
4c40: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4c50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f  n SQLITE_OK;.}./
4c60: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
4c70: 20 77 69 74 68 20 69 6e 64 65 78 20 69 43 65 6c   with index iCel
4c80: 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 20  l on page pPage 
4c90: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
4ca0: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
4cb0: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
4cc0: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
4cd0: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
4ce0: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
4cf0: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
4d00: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75  tic int ptrmapPu
4d10: 74 4f 76 66 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tOvfl(MemPage *p
4d20: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
4d30: 7b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20  {.  u8 *pCell;. 
4d40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4d50: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
4d60: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
4d70: 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64  ;.  pCell = find
4d80: 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
4d90: 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 20 20 72 65  ge, iCell);.  re
4da0: 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76  turn ptrmapPutOv
4db0: 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
4dc0: 6c 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ll);.}.#endif...
4dd0: 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74  /*.** Defragment
4de0: 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e   the page given.
4df0: 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20    All Cells are 
4e00: 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  moved to the.** 
4e10: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20  end of the page 
4e20: 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61  and all free spa
4e30: 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ce is collected 
4e40: 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20  into one.** big 
4e50: 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63  FreeBlk that occ
4e60: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74  urs in between t
4e70: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65  he header and ce
4e80: 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72  ll.** pointer ar
4e90: 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  ray and the cell
4ea0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a   content area..*
4eb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66  /.static int def
4ec0: 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50  ragmentPage(MemP
4ed0: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
4ee0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
4ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
4f00: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
4f10: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
4f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
4f30: 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63  ress of a i-th c
4f40: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ell */.  int add
4f50: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
4f60: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
4f70: 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
4f80: 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  r cell pointer a
4f90: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64  rray */.  int hd
4fa0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
4fb0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
4fc0: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
4fd0: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ff0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
5000: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
5010: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
5020: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5030: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
5040: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
5050: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
5060: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
5070: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
5080: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
5090: 20 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20   int brk;       
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
50b0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
50c0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
50d0: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
50f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
5100: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
5110: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5120: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
5130: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
5140: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
5150: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
5160: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
5170: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
5180: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5190: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
51a0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
51b0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
51c0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
51d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
51e0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
51f0: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
5200: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
5210: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
5220: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
5230: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5240: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
5250: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
5260: 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65  .  temp = sqlite
5270: 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
5280: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
5290: 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  er);.  data = pP
52a0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
52b0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
52c0: 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73  fset;.  cellOffs
52d0: 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
52e0: 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20  Offset;.  nCell 
52f0: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
5300: 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d    assert( nCell=
5310: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
5320: 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61  hdr+3]) );.  usa
5330: 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
5340: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
5350: 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79  ;.  brk = get2by
5360: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
5370: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70  ;.  memcpy(&temp
5380: 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b  [brk], &data[brk
5390: 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  ], usableSize - 
53a0: 62 72 6b 29 3b 0a 20 20 62 72 6b 20 3d 20 75 73  brk);.  brk = us
53b0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28  ableSize;.  for(
53c0: 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
53d0: 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64  +){.    u8 *pAdd
53e0: 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d  r;     /* The i-
53f0: 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  th cell pointer 
5400: 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26  */.    pAddr = &
5410: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20  data[cellOffset 
5420: 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d  + i*2];.    pc =
5430: 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29   get2byte(pAddr)
5440: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63  ;.    assert( pc
5450: 3c 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  <pPage->pBt->usa
5460: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 73  bleSize );.    s
5470: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
5480: 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b 70  r(pPage, &temp[p
5490: 63 5d 29 3b 0a 20 20 20 20 62 72 6b 20 2d 3d 20  c]);.    brk -= 
54a0: 73 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79  size;.    memcpy
54b0: 28 26 64 61 74 61 5b 62 72 6b 5d 2c 20 26 74 65  (&data[brk], &te
54c0: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
54d0: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
54e0: 72 2c 20 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61  r, brk);.  }.  a
54f0: 73 73 65 72 74 28 20 62 72 6b 3e 3d 63 65 6c 6c  ssert( brk>=cell
5500: 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29  Offset+2*nCell )
5510: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
5520: 74 61 5b 68 64 72 2b 35 5d 2c 20 62 72 6b 29 3b  ta[hdr+5], brk);
5530: 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d  .  data[hdr+1] =
5540: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32   0;.  data[hdr+2
5550: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
5560: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72  r+7] = 0;.  addr
5570: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a   = cellOffset+2*
5580: 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28  nCell;.  memset(
5590: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20  &data[addr], 0, 
55a0: 62 72 6b 2d 61 64 64 72 29 3b 0a 20 20 72 65 74  brk-addr);.  ret
55b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
55c0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
55d0: 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
55e0: 73 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e  space on a page.
55f0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
5600: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
5610: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74  ge->aData[] of t
5620: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
5630: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f  .** the new allo
5640: 63 61 74 69 6f 6e 2e 20 4f 72 20 72 65 74 75 72  cation. Or retur
5650: 6e 20 30 20 69 66 20 74 68 65 72 65 20 69 73 20  n 0 if there is 
5660: 6e 6f 74 20 65 6e 6f 75 67 68 20 66 72 65 65 0a  not enough free.
5670: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ** space on the 
5680: 70 61 67 65 20 74 6f 20 73 61 74 69 73 66 79 20  page to satisfy 
5690: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72  the allocation r
56a0: 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  equest..**.** If
56b0: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
56c0: 6e 73 20 6e 42 79 74 65 73 20 6f 66 20 66 72 65  ns nBytes of fre
56d0: 65 20 73 70 61 63 65 20 62 75 74 20 64 6f 65 73  e space but does
56e0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   not contain.** 
56f0: 6e 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 69 67  nBytes of contig
5700: 75 6f 75 73 20 66 72 65 65 20 73 70 61 63 65 2c  uous free space,
5710: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
5720: 6e 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ne automatically
5730: 0a 2a 2a 20 63 61 6c 6c 73 20 64 65 66 72 61 67  .** calls defrag
5740: 65 6d 65 6e 74 50 61 67 65 28 29 20 74 6f 20 63  ementPage() to c
5750: 6f 6e 73 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66  onsolidate all f
5760: 72 65 65 20 73 70 61 63 65 20 62 65 66 6f 72 65  ree space before
5770: 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20   .** allocating 
5780: 74 68 65 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a  the new chunk..*
5790: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
57a0: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
57b0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
57c0: 42 79 74 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  Byte){.  int add
57d0: 72 2c 20 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e  r, pc, hdr;.  in
57e0: 74 20 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46  t size;.  int nF
57f0: 72 61 67 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a  rag;.  int top;.
5800: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69    int nCell;.  i
5810: 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  nt cellOffset;. 
5820: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5830: 64 61 74 61 3b 0a 20 20 0a 20 20 64 61 74 61 20  data;.  .  data 
5840: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
5850: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5860: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
5870: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
5880: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5890: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
58a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
58b0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
58c0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
58d0: 20 20 69 66 28 20 6e 42 79 74 65 3c 34 20 29 20    if( nByte<4 ) 
58e0: 6e 42 79 74 65 20 3d 20 34 3b 0a 20 20 69 66 28  nByte = 4;.  if(
58f0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 6e 42   pPage->nFree<nB
5900: 79 74 65 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f  yte || pPage->nO
5910: 76 65 72 66 6c 6f 77 3e 30 20 29 20 72 65 74 75  verflow>0 ) retu
5920: 72 6e 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  rn 0;.  pPage->n
5930: 46 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20  Free -= nByte;. 
5940: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
5950: 72 4f 66 66 73 65 74 3b 0a 0a 20 20 6e 46 72 61  rOffset;..  nFra
5960: 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b  g = data[hdr+7];
5970: 0a 20 20 69 66 28 20 6e 46 72 61 67 3c 36 30 20  .  if( nFrag<60 
5980: 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  ){.    /* Search
5990: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f   the freelist lo
59a0: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 73 6c 6f 74  oking for a slot
59b0: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
59c0: 61 74 69 73 66 79 20 74 68 65 0a 20 20 20 20 2a  atisfy the.    *
59d0: 2a 20 73 70 61 63 65 20 72 65 71 75 65 73 74 2e  * space request.
59e0: 20 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d 20 68   */.    addr = h
59f0: 64 72 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65 28  dr+1;.    while(
5a00: 20 28 70 63 20 3d 20 67 65 74 32 62 79 74 65 28   (pc = get2byte(
5a10: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20  &data[addr]))>0 
5a20: 29 7b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20  ){.      size = 
5a30: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
5a40: 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  c+2]);.      if(
5a50: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
5a60: 20 20 20 20 20 20 20 20 69 66 28 20 73 69 7a 65          if( size
5a70: 3c 6e 42 79 74 65 2b 34 20 29 7b 0a 20 20 20 20  <nByte+4 ){.    
5a80: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
5a90: 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b  ta[addr], &data[
5aa0: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
5ab0: 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d     data[hdr+7] =
5ac0: 20 6e 46 72 61 67 20 2b 20 73 69 7a 65 20 2d 20   nFrag + size - 
5ad0: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 20  nByte;.         
5ae0: 20 72 65 74 75 72 6e 20 70 63 3b 0a 20 20 20 20   return pc;.    
5af0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5b00: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
5b10: 61 74 61 5b 70 63 2b 32 5d 2c 20 73 69 7a 65 2d  ata[pc+2], size-
5b20: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
5b30: 20 20 72 65 74 75 72 6e 20 70 63 20 2b 20 73 69    return pc + si
5b40: 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze - nByte;.    
5b50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
5b60: 20 20 20 20 61 64 64 72 20 3d 20 70 63 3b 0a 20      addr = pc;. 
5b70: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
5b80: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
5b90: 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62  rom the gap in b
5ba0: 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20  etween the cell 
5bb0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20  pointer array.  
5bc0: 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ** and the cell 
5bd0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20 20  content area..  
5be0: 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62  */.  top = get2b
5bf0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
5c00: 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74  );.  nCell = get
5c10: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
5c20: 33 5d 29 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  3]);.  cellOffse
5c30: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
5c40: 66 66 73 65 74 3b 0a 20 20 69 66 28 20 6e 46 72  ffset;.  if( nFr
5c50: 61 67 3e 3d 36 30 20 7c 7c 20 63 65 6c 6c 4f 66  ag>=60 || cellOf
5c60: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e  fset + 2*nCell >
5c70: 20 74 6f 70 20 2d 20 6e 42 79 74 65 20 29 7b 0a   top - nByte ){.
5c80: 20 20 20 20 69 66 28 20 64 65 66 72 61 67 6d 65      if( defragme
5c90: 6e 74 50 61 67 65 28 70 50 61 67 65 29 20 29 20  ntPage(pPage) ) 
5ca0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 74 6f  return 0;.    to
5cb0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
5cc0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a  ta[hdr+5]);.  }.
5cd0: 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a    top -= nByte;.
5ce0: 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 4f 66    assert( cellOf
5cf0: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c  fset + 2*nCell <
5d00: 3d 20 74 6f 70 20 29 3b 0a 20 20 70 75 74 32 62  = top );.  put2b
5d10: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
5d20: 2c 20 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e  , top);.  return
5d30: 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   top;.}../*.** R
5d40: 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20  eturn a section 
5d50: 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  of the pPage->aD
5d60: 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ata to the freel
5d70: 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  ist..** The firs
5d80: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65  t byte of the ne
5d90: 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  w free block is 
5da0: 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61  pPage->aDisk[sta
5db0: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
5dc0: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
5dd0: 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73   is "size" bytes
5de0: 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20  ..**.** Most of 
5df0: 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20  the effort here 
5e00: 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63  is involved in c
5e10: 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e  oalesing adjacen
5e20: 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73  t.** free blocks
5e30: 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62   into a single b
5e40: 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a  ig free block..*
5e50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
5e60: 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  eeSpace(MemPage 
5e70: 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72  *pPage, int star
5e80: 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20  t, int size){.  
5e90: 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e  int addr, pbegin
5ea0: 2c 20 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65  , hdr;.  unsigne
5eb0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
5ec0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20  Page->aData;..  
5ed0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
5ee0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
5ef0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
5f00: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
5f10: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
5f20: 61 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70  assert( start>=p
5f30: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
5f40: 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30  6+(pPage->leaf?0
5f50: 3a 34 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  :4) );.  assert(
5f60: 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c   (start + size)<
5f70: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
5f80: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
5f90: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5fa0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
5fb0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5fc0: 69 66 28 20 73 69 7a 65 3c 34 20 29 20 73 69 7a  if( size<4 ) siz
5fd0: 65 20 3d 20 34 3b 0a 0a 23 69 66 64 65 66 20 53  e = 4;..#ifdef S
5fe0: 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
5ff0: 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69  ETE.  /* Overwri
6000: 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
6010: 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
6020: 73 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52  s when the SECUR
6030: 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f  E_DELETE .  ** o
6040: 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
6050: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
6060: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61   */.  memset(&da
6070: 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69  ta[start], 0, si
6080: 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ze);.#endif..  /
6090: 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20  * Add the space 
60a0: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69  back into the li
60b0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65  nked list of fre
60c0: 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72  eblocks */.  hdr
60d0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
60e0: 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64  set;.  addr = hd
60f0: 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  r + 1;.  while( 
6100: 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79  (pbegin = get2by
6110: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
6120: 3c 73 74 61 72 74 20 26 26 20 70 62 65 67 69 6e  <start && pbegin
6130: 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
6140: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
6150: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
6160: 2d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -4 );.    assert
6170: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b  ( pbegin>addr );
6180: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67  .    addr = pbeg
6190: 69 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  in;.  }.  assert
61a0: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
61b0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
61c0: 2d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  -4 );.  assert( 
61d0: 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70  pbegin>addr || p
61e0: 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75  begin==0 );.  pu
61f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
6200: 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75  r], start);.  pu
6210: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
6220: 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20  rt], pbegin);.  
6230: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
6240: 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a  tart+2], size);.
6250: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
6260: 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  = size;..  /* Co
6270: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
6280: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
6290: 20 61 64 64 72 20 3d 20 70 50 61 67 65 2d 3e 68   addr = pPage->h
62a0: 64 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20 20  drOffset + 1;.  
62b0: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
62c0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
62d0: 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20  addr]))>0 ){.   
62e0: 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a   int pnext, psiz
62f0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
6300: 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20  begin>addr );.  
6310: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
6320: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
6330: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
6340: 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79    pnext = get2by
6350: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  te(&data[pbegin]
6360: 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67  );.    psize = g
6370: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
6380: 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66  egin+2]);.    if
6390: 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65  ( pbegin + psize
63a0: 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26   + 3 >= pnext &&
63b0: 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20   pnext>0 ){.    
63c0: 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65    int frag = pne
63d0: 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69  xt - (pbegin+psi
63e0: 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ze);.      asser
63f0: 74 28 20 66 72 61 67 3c 3d 64 61 74 61 5b 70 50  t( frag<=data[pP
6400: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37  age->hdrOffset+7
6410: 5d 20 29 3b 0a 20 20 20 20 20 20 64 61 74 61 5b  ] );.      data[
6420: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
6430: 2b 37 5d 20 2d 3d 20 66 72 61 67 3b 0a 20 20 20  +7] -= frag;.   
6440: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
6450: 61 5b 70 62 65 67 69 6e 5d 2c 20 67 65 74 32 62  a[pbegin], get2b
6460: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d  yte(&data[pnext]
6470: 29 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79  ));.      put2by
6480: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
6490: 32 5d 2c 20 70 6e 65 78 74 2b 67 65 74 32 62 79  2], pnext+get2by
64a0: 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32  te(&data[pnext+2
64b0: 5d 29 2d 70 62 65 67 69 6e 29 3b 0a 20 20 20 20  ])-pbegin);.    
64c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
64d0: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20  r = pbegin;.    
64e0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
64f0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
6500: 61 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68  area begins with
6510: 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65   a freeblock, re
6520: 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66  move it. */.  if
6530: 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64  ( data[hdr+1]==d
6540: 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61  ata[hdr+5] && da
6550: 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b  ta[hdr+2]==data[
6560: 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e  hdr+6] ){.    in
6570: 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69  t top;.    pbegi
6580: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
6590: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
65a0: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72  memcpy(&data[hdr
65b0: 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69  +1], &data[pbegi
65c0: 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20  n], 2);.    top 
65d0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
65e0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 75  [hdr+5]);.    pu
65f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
6600: 2b 35 5d 2c 20 74 6f 70 20 2b 20 67 65 74 32 62  +5], top + get2b
6610: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
6620: 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  +2]));.  }.}../*
6630: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
6640: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
6650: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
6660: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
6670: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
6680: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
6690: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
66a0: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
66b0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
66c0: 64 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65  d decodeFlags(Me
66d0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
66e0: 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42  t flagByte){.  B
66f0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
6700: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
6710: 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20  Page->pBt */..  
6720: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68  assert( pPage->h
6730: 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65  drOffset==(pPage
6740: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
6750: 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  : 0) );.  assert
6760: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6770: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
6780: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
6790: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 28 66 6c  ge->intKey = (fl
67a0: 61 67 42 79 74 65 20 26 20 28 50 54 46 5f 49 4e  agByte & (PTF_IN
67b0: 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
67c0: 41 29 29 21 3d 30 3b 0a 20 20 70 50 61 67 65 2d  A))!=0;.  pPage-
67d0: 3e 7a 65 72 6f 44 61 74 61 20 3d 20 28 66 6c 61  >zeroData = (fla
67e0: 67 42 79 74 65 20 26 20 50 54 46 5f 5a 45 52 4f  gByte & PTF_ZERO
67f0: 44 41 54 41 29 21 3d 30 3b 0a 20 20 70 50 61 67  DATA)!=0;.  pPag
6800: 65 2d 3e 6c 65 61 66 20 3d 20 28 66 6c 61 67 42  e->leaf = (flagB
6810: 79 74 65 20 26 20 50 54 46 5f 4c 45 41 46 29 21  yte & PTF_LEAF)!
6820: 3d 30 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69  =0;.  pPage->chi
6830: 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2a 28 70  ldPtrSize = 4*(p
6840: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 3b 0a  Page->leaf==0);.
6850: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
6860: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
6870: 74 65 20 26 20 50 54 46 5f 4c 45 41 46 44 41 54  te & PTF_LEAFDAT
6880: 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  A ){.    pPage->
6890: 6c 65 61 66 44 61 74 61 20 3d 20 31 3b 0a 20 20  leafData = 1;.  
68a0: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
68b0: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
68c0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
68d0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
68e0: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Leaf;.  }else{. 
68f0: 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61     pPage->leafDa
6900: 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ta = 0;.    pPag
6910: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
6920: 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  t->maxLocal;.   
6930: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
6940: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c   = pBt->minLocal
6950: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 68  ;.  }.  pPage->h
6960: 61 73 44 61 74 61 20 3d 20 21 28 70 50 61 67 65  asData = !(pPage
6970: 2d 3e 7a 65 72 6f 44 61 74 61 20 7c 7c 20 28 21  ->zeroData || (!
6980: 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 20 70  pPage->leaf && p
6990: 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 29 29  Page->leafData))
69a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
69b0: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
69c0: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
69d0: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
69e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 61 72  ..**.** The pPar
69f0: 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 6d 75  ent parameter mu
6a00: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
6a10: 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 77  to the MemPage w
6a20: 68 69 63 68 0a 2a 2a 20 69 73 20 74 68 65 20 70  hich.** is the p
6a30: 61 72 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  arent of the pag
6a40: 65 20 62 65 69 6e 67 20 69 6e 69 74 69 61 6c 69  e being initiali
6a50: 7a 65 64 2e 20 20 54 68 65 20 72 6f 6f 74 20 6f  zed.  The root o
6a60: 66 20 61 0a 2a 2a 20 42 54 72 65 65 20 68 61 73  f a.** BTree has
6a70: 20 6e 6f 20 70 61 72 65 6e 74 20 61 6e 64 20 73   no parent and s
6a80: 6f 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2c  o for that page,
6a90: 20 70 50 61 72 65 6e 74 3d 3d 4e 55 4c 4c 2e 0a   pParent==NULL..
6aa0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
6ab0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
6ac0: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
6ad0: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
6ae0: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
6af0: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
6b00: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
6b10: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
6b20: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
6b30: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
6b40: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
6b50: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
6b60: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
6b70: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
6b80: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
6b90: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
6ba0: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
6bb0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
6bc0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
6bd0: 49 6e 69 74 50 61 67 65 28 0a 20 20 4d 65 6d 50  InitPage(.  MemP
6be0: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
6bf0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
6c00: 6f 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  o be initialized
6c10: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
6c20: 50 61 72 65 6e 74 20 20 20 20 20 20 20 2f 2a 20  Parent       /* 
6c30: 54 68 65 20 70 61 72 65 6e 74 2e 20 20 4d 69 67  The parent.  Mig
6c40: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
6c50: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
6c60: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
6c70: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
6c80: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
6c90: 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 68  ata[] */.  int h
6ca0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dr;           /*
6cb0: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
6cc0: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
6cd0: 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  der */.  u8 *dat
6ce0: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
6cf0: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
6d00: 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61 72  Data */.  BtShar
6d10: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
6d20: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
6d30: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
6d40: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
6d50: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
6d60: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
6d70: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
6d80: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
6d90: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
6da0: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
6db0: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
6dc0: 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  inter */.  int n
6dd0: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
6de0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
6df0: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
6e00: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  age */.  int top
6e10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
6e20: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
6e30: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
6e40: 65 61 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70  ea */..  pBt = p
6e50: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73  Page->pBt;.  ass
6e60: 65 72 74 28 20 70 42 74 21 3d 30 20 29 3b 0a 20  ert( pBt!=0 );. 
6e70: 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
6e80: 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
6e90: 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 61 73  pBt==pBt );.  as
6ea0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
6eb0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
6ec0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
6ed0: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
6ee0: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
6ef0: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
6f00: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
6f10: 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
6f20: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
6f30: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
6f40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
6f50: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
6f60: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
6f70: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
6f80: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
6f90: 2d 3e 70 50 61 72 65 6e 74 21 3d 70 50 61 72 65  ->pParent!=pPare
6fa0: 6e 74 20 26 26 20 28 70 50 61 67 65 2d 3e 70 50  nt && (pPage->pP
6fb0: 61 72 65 6e 74 21 3d 30 20 7c 7c 20 70 50 61 67  arent!=0 || pPag
6fc0: 65 2d 3e 69 73 49 6e 69 74 29 20 29 7b 0a 20 20  e->isInit) ){.  
6fd0: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
6fe0: 70 61 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  page should neve
6ff0: 72 20 63 68 61 6e 67 65 20 75 6e 6c 65 73 73 20  r change unless 
7000: 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  the file is corr
7010: 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  upt */.    retur
7020: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
7030: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
7040: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
7050: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7060: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  K;.  if( pPage->
7070: 70 50 61 72 65 6e 74 3d 3d 30 20 26 26 20 70 50  pParent==0 && pP
7080: 61 72 65 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20  arent!=0 ){.    
7090: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
70a0: 20 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71   pParent;.    sq
70b0: 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
70c0: 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
70d0: 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20 70 50 61  .  }.  hdr = pPa
70e0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
70f0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
7100: 44 61 74 61 3b 0a 20 20 64 65 63 6f 64 65 46 6c  Data;.  decodeFl
7110: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
7120: 68 64 72 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e  hdr]);.  pPage->
7130: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
7140: 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
7150: 20 3d 20 30 3b 0a 20 20 75 73 61 62 6c 65 53 69   = 0;.  usableSi
7160: 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
7170: 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 63  Size;.  pPage->c
7180: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c  ellOffset = cell
7190: 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31  Offset = hdr + 1
71a0: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
71b0: 66 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62  f;.  top = get2b
71c0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
71d0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
71e0: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
71f0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 69 66  ta[hdr+3]);.  if
7200: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
7210: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
7220: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
7230: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
7240: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
7250: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
7260: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
7270: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7280: 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  PT;.  }.  if( pP
7290: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  age->nCell==0 &&
72a0: 20 70 50 61 72 65 6e 74 21 3d 30 20 26 26 20 70   pParent!=0 && p
72b0: 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20  Parent->pgno!=1 
72c0: 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 70 61  ){.    /* All pa
72d0: 67 65 73 20 6d 75 73 74 20 68 61 76 65 20 61 74  ges must have at
72e0: 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 2c   least one cell,
72f0: 20 65 78 63 65 70 74 20 66 6f 72 20 72 6f 6f 74   except for root
7300: 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72 65   pages */.    re
7310: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7320: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
7330: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
7340: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
7350: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
7360: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
7370: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
7380: 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
7390: 72 2b 37 5d 20 2b 20 74 6f 70 20 2d 20 28 63 65  r+7] + top - (ce
73a0: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
73b0: 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 77 68  ge->nCell);.  wh
73c0: 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
73d0: 20 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b   int next, size;
73e0: 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62  .    if( pc>usab
73f0: 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20  leSize-4 ){.    
7400: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 20    /* Free block 
7410: 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20  is off the page 
7420: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
7430: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7440: 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20  KPT; .    }.    
7450: 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65 28  next = get2byte(
7460: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
7470: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
7480: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
7490: 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20    if( next>0 && 
74a0: 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20  next<=pc+size+3 
74b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  ){.      /* Free
74c0: 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20   blocks must be 
74d0: 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
74e0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  er */.      retu
74f0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7500: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20  T_BKPT; .    }. 
7510: 20 20 20 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65     nFree += size
7520: 3b 0a 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b  ;.    pc = next;
7530: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46  .  }.  pPage->nF
7540: 72 65 65 20 3d 20 6e 46 72 65 65 3b 0a 20 20 69  ree = nFree;.  i
7550: 66 28 20 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65  f( nFree>=usable
7560: 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 46  Size ){.    /* F
7570: 72 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f 74  ree space cannot
7580: 20 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70 61   exceed total pa
7590: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72  ge size */.    r
75a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
75b0: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a  RUPT_BKPT; .  }.
75c0: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
75d0: 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
75e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
75f0: 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20  ** Set up a raw 
7600: 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20  page so that it 
7610: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74  looks like a dat
7620: 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69  abase page holdi
7630: 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  ng.** no entries
7640: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7650: 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67   zeroPage(MemPag
7660: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
7670: 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ags){.  unsigned
7680: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
7690: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74  age->aData;.  Bt
76a0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
76b0: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  age->pBt;.  int 
76c0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
76d0: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 66 69  Offset;.  int fi
76e0: 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
76f0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
7700: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
7710: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
7720: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
7730: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
7740: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
7750: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
7760: 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
7770: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
7780: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
7790: 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
77a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
77b0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
77c0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
77d0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
77e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
77f0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
7800: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
7810: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
7820: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
7830: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d  );.  data[hdr] =
7840: 20 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20   flags;.  first 
7850: 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28  = hdr + 8 + 4*((
7860: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
7870: 3d 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  =0);.  memset(&d
7880: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
7890: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
78a0: 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
78b0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
78c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
78d0: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
78e0: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
78f0: 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63  e - first;.  dec
7900: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
7910: 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
7920: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72  >hdrOffset = hdr
7930: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
7940: 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20  ffset = first;. 
7950: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
7960: 77 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  w = 0;.  pPage->
7970: 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20  idxShift = 0;.  
7980: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
7990: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
79a0: 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
79b0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
79c0: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
79d0: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
79e0: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
79f0: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
7a00: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
7a10: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
7a20: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
7a30: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
7a40: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
7a50: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
7a60: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
7a70: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
7a80: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
7a90: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
7aa0: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
7ab0: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
7ac0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
7ad0: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
7ae0: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
7af0: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
7b00: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
7b10: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
7b20: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
7b30: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
7b40: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
7b50: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
7b60: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
7b70: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
7b80: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69  that point..*/.i
7b90: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
7ba0: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
7bb0: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
7bc0: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
7bd0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
7be0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7bf0: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
7c00: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
7c10: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
7c20: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
7c30: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
7c40: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ter */.  int noC
7c50: 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a  ontent        /*
7c60: 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67   Do not load pag
7c70: 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75  e content if tru
7c80: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
7c90: 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
7ca0: 67 65 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  ge;.  DbPage *pD
7cb0: 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
7cc0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7cd0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7ce0: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
7cf0: 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
7d00: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
7d10: 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
7d20: 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
7d30: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
7d40: 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 20  urn rc;.  pPage 
7d50: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
7d60: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
7d70: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
7d80: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
7d90: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
7da0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
7db0: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
7dc0: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
7dd0: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
7de0: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
7df0: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
7e00: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  set = pPage->pgn
7e10: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
7e20: 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
7e30: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
7e40: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
7e50: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
7e60: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
7e70: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
7e80: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
7e90: 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65   just a convenie
7ea0: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
7eb0: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
7ec0: 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42  s to.** sqlite3B
7ed0: 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e  treeGetPage() an
7ee0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  d sqlite3BtreeIn
7ef0: 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  itPage()..*/.sta
7f00: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
7f10: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
7f20: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
7f30: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
7f40: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
7f50: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
7f60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
7f70: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
7f80: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
7f90: 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
7fa0: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
7fb0: 72 20 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50  r here */.  MemP
7fc0: 61 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20  age *pParent    
7fd0: 20 2f 2a 20 50 61 72 65 6e 74 20 6f 66 20 74 68   /* Parent of th
7fe0: 65 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  e page */.){.  i
7ff0: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
8000: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8010: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
8020: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  );.  if( pgno==0
8030: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8040: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8050: 50 54 3b 20 0a 20 20 7d 0a 20 20 72 63 20 3d 20  PT; .  }.  rc = 
8060: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
8070: 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
8080: 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  pPage, 0);.  if(
8090: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
80a0: 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  & (*ppPage)->isI
80b0: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  nit==0 ){.    rc
80c0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
80d0: 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 2c  nitPage(*ppPage,
80e0: 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69   pParent);.    i
80f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8100: 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
8110: 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
8120: 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
8130: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
8140: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8150: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
8160: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
8170: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
8180: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
8190: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  .** call to sqli
81a0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 2e  te3BtreeGetPage.
81b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
81c0: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
81d0: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
81e0: 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
81f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
8200: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
8210: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
8220: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
8230: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
8240: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
8250: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
8260: 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ge );.    assert
8270: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
8280: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
8290: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
82a0: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
82b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
82c0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
82d0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
82e0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
82f0: 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
8300: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8310: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8320: 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
8330: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
8340: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 72 65  for a page.** re
8350: 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 57 65 20  aches zero.  We 
8360: 6e 65 65 64 20 74 6f 20 75 6e 72 65 66 20 74 68  need to unref th
8370: 65 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65  e pParent pointe
8380: 72 20 77 68 65 6e 20 74 68 61 74 0a 2a 2a 20 68  r when that.** h
8390: 61 70 70 65 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  appens..*/.stati
83a0: 63 20 76 6f 69 64 20 70 61 67 65 44 65 73 74 72  c void pageDestr
83b0: 75 63 74 6f 72 28 44 62 50 61 67 65 20 2a 70 44  uctor(DbPage *pD
83c0: 61 74 61 2c 20 69 6e 74 20 70 61 67 65 53 69 7a  ata, int pageSiz
83d0: 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
83e0: 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
83f0: 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
8400: 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  0 );.  pPage = (
8410: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
8420: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
8430: 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
8440: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d   pPage->isInit==
8450: 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74  0 || sqlite3_mut
8460: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
8470: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
8480: 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65  if( pPage->pPare
8490: 6e 74 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  nt ){.    MemPag
84a0: 65 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61  e *pParent = pPa
84b0: 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20  ge->pParent;.   
84c0: 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
84d0: 2d 3e 70 42 74 3d 3d 70 50 61 67 65 2d 3e 70 42  ->pBt==pPage->pB
84e0: 74 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  t );.    pPage->
84f0: 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20  pParent = 0;.   
8500: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
8510: 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 70 50 61  rent);.  }.  pPa
8520: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
8530: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  }../*.** During 
8540: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
8550: 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
8560: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
8570: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
8580: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
8590: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
85a0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
85b0: 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
85c0: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
85d0: 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
85e0: 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
85f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8600: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
8610: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
8620: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
8630: 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
8640: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
8650: 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
8660: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
8670: 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
8680: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
8690: 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
86a0: 61 74 61 2c 20 69 6e 74 20 70 61 67 65 53 69 7a  ata, int pageSiz
86b0: 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
86c0: 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
86d0: 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
86e0: 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  0 );.  pPage = (
86f0: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
8700: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
8710: 44 61 74 61 29 3b 0a 20 20 69 66 28 20 70 50 61  Data);.  if( pPa
8720: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
8730: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8740: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8750: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8760: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
8770: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 73 71  Init = 0;.    sq
8780: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
8790: 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ge(pPage, pPage-
87a0: 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d  >pParent);.  }.}
87b0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
87c0: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
87d0: 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a  for a btree..*/.
87e0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
87f0: 65 33 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  e3BtreeInvokeBus
8800: 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70  yHandler(void *p
8810: 41 72 67 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 42  Arg, int n){.  B
8820: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
8830: 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
8840: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
8850: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
8860: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8870: 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
8880: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
8890: 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
88a0: 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
88b0: 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d  >busyHandler);.}
88c0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
88d0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
88e0: 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
88f0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
8900: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
8910: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
8920: 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20  s NULL.** a new 
8930: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20  database with a 
8940: 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63  random name is c
8950: 72 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61  reated.  This ra
8960: 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20  ndomly named.** 
8970: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
8980: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68  ll be deleted wh
8990: 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  en sqlite3BtreeC
89a0: 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
89b0: 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
89c0: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
89d0: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
89e0: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
89f0: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
8a00: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
8a10: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
8a20: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
8a30: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
8a40: 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
8a50: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
8a60: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
8a70: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
8a80: 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
8a90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
8aa0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
8ab0: 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
8ac0: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
8ad0: 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
8ae0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
8af0: 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
8b00: 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
8b10: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
8b20: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
8b30: 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
8b40: 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
8b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
8b60: 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
8b70: 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
8b80: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
8b90: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
8ba0: 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  fs;      /* The 
8bb0: 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74  VFS to use for t
8bc0: 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42  his btree */.  B
8bd0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30  tShared *pBt = 0
8be0: 3b 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64  ;      /* Shared
8bf0: 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
8c00: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
8c10: 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
8c20: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
8c30: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
8c40: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
8c50: 4b 3b 0a 20 20 69 6e 74 20 6e 52 65 73 65 72 76  K;.  int nReserv
8c60: 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  e;.  unsigned ch
8c70: 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
8c80: 5d 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  ];..  /* Set the
8c90: 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64   variable isMemd
8ca0: 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e  b to true for an
8cb0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
8cc0: 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61  ase, or .  ** fa
8cd0: 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62  lse for a file-b
8ce0: 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 20 54  ased database. T
8cf0: 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e  his symbol is on
8d00: 6c 79 20 72 65 71 75 69 72 65 64 20 69 66 0a 20  ly required if. 
8d10: 20 2a 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68   ** either of th
8d20: 65 20 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72  e shared-data or
8d30: 20 61 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74   autovacuum feat
8d40: 75 72 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65  ures are compile
8d50: 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  d .  ** into the
8d60: 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23   library..  */.#
8d70: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8d80: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
8d90: 41 43 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65  ACHE) || !define
8da0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d(SQLITE_OMIT_AU
8db0: 54 4f 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64  TOVACUUM).  #ifd
8dc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
8dd0: 45 4d 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73  EMORYDB.    cons
8de0: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
8df0: 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63  0;.  #else.    c
8e00: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
8e10: 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20   = zFilename && 
8e20: 21 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d  !strcmp(zFilenam
8e30: 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a  e, ":memory:");.
8e40: 20 20 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a    #endif.#endif.
8e50: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
8e60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
8e70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8e80: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  (db->mutex) );..
8e90: 20 20 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66    pVfs = db->pVf
8ea0: 73 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  s;.  p = sqlite3
8eb0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
8ec0: 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
8ed0: 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
8ee0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
8ef0: 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
8f00: 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
8f10: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a 23 69   p->db = db;..#i
8f20: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
8f30: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
8f40: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
8f50: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
8f60: 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  KIO).  /*.  ** I
8f70: 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20  f this Btree is 
8f80: 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
8f90: 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72  shared cache, tr
8fa0: 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a  y to find an.  *
8fb0: 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61  * existing BtSha
8fc0: 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20  red object that 
8fd0: 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74  we can share wit
8fe0: 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 66 6c  h.  */.  if( (fl
8ff0: 61 67 73 20 26 20 42 54 52 45 45 5f 50 52 49 56  ags & BTREE_PRIV
9000: 41 54 45 29 3d 3d 30 0a 20 20 20 26 26 20 69 73  ATE)==0.   && is
9010: 4d 65 6d 64 62 3d 3d 30 0a 20 20 20 26 26 20 28  Memdb==0.   && (
9020: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
9030: 54 45 5f 56 74 61 62 29 3d 3d 30 0a 20 20 20 26  TE_Vtab)==0.   &
9040: 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  & zFilename && z
9050: 46 69 6c 65 6e 61 6d 65 5b 30 5d 0a 20 20 29 7b  Filename[0].  ){
9060: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
9070: 53 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  SharedCacheEnabl
9080: 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ed ){.      int 
9090: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
90a0: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
90b0: 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
90c0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
90d0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
90e0: 6d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68  malloc(nFullPath
90f0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  name);.      sql
9100: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
9110: 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70  xShared;.      p
9120: 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
9130: 20 20 20 20 20 20 69 66 28 20 64 62 20 29 7b 0a        if( db ){.
9140: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
9150: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72  s |= SQLITE_Shar
9160: 65 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20 7d  edCache;.      }
9170: 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c  .      if( !zFul
9180: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
9190: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
91a0: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
91b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
91c0: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
91d0: 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
91e0: 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
91f0: 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74  lename, nFullPat
9200: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
9210: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74  name);.      mut
9220: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
9230: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
9240: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
9250: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
9260: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9270: 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
9280: 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 42  d);.      for(pB
9290: 74 3d 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  t=sqlite3SharedC
92a0: 61 63 68 65 4c 69 73 74 3b 20 70 42 74 3b 20 70  acheList; pBt; p
92b0: 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
92c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
92d0: 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
92e0: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74         if( 0==st
92f0: 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rcmp(zFullPathna
9300: 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  me, sqlite3Pager
9310: 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50  Filename(pBt->pP
9320: 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
9330: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
9340: 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
9350: 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
9360: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42  .          p->pB
9370: 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20  t = pBt;.       
9380: 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a     pBt->nRef++;.
9390: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
93a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
93b0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
93c0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
93d0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
93e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
93f0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
9400: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
9410: 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65  E_DEBUG.    else
9420: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65  {.      /* In de
9430: 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72  bug mode, we mar
9440: 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74  k all persistent
9450: 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68   databases as sh
9460: 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20  arable.      ** 
9470: 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61  even when they a
9480: 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78  re not.  This ex
9490: 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b  ercises the lock
94a0: 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20  ing code and.   
94b0: 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65     ** gives more
94c0: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72   opportunity for
94d0: 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33   asserts(sqlite3
94e0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20  _mutex_held()). 
94f0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
9500: 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69  ts to find locki
9510: 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20  ng problems..   
9520: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73     */.      p->s
9530: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
9540: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65   }.#endif.  }.#e
9550: 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d  ndif.  if( pBt==
9560: 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  0 ){.    /*.    
9570: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
9580: 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75   asserts make su
9590: 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72  re that structur
95a0: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62  es used by the b
95b0: 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  tree are.    ** 
95c0: 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20  the right size. 
95d0: 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72   This is to guar
95e0: 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63  d against size c
95f0: 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75  hanges that resu
9600: 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63  lt.    ** when c
9610: 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69  ompiling on a di
9620: 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63  fferent architec
9630: 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
9640: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
9650: 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  i64)==8 || sizeo
9660: 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(i64)==4 );.   
9670: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
9680: 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  u64)==8 || sizeo
9690: 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u64)==4 );.   
96a0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
96b0: 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
96c0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
96d0: 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
96e0: 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
96f0: 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
9700: 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
9710: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
9720: 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
9730: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
9740: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
9750: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  M;.      goto bt
9760: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
9770: 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 62 75 73    }.    pBt->bus
9780: 79 48 64 72 2e 78 46 75 6e 63 20 3d 20 73 71 6c  yHdr.xFunc = sql
9790: 69 74 65 33 42 74 72 65 65 49 6e 76 6f 6b 65 42  ite3BtreeInvokeB
97a0: 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20  usyHandler;.    
97b0: 70 42 74 2d 3e 62 75 73 79 48 64 72 2e 70 41 72  pBt->busyHdr.pAr
97c0: 67 20 3d 20 70 42 74 3b 0a 20 20 20 20 72 63 20  g = pBt;.    rc 
97d0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
97e0: 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
97f0: 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
9800: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9810: 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52              EXTR
9820: 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76  A_SIZE, flags, v
9830: 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  fsFlags);.    if
9840: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9850: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
9860: 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
9870: 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
9880: 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
9890: 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
98a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
98b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
98c0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
98d0: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
98e0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61   }.    sqlite3Pa
98f0: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
9900: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  r(pBt->pPager, &
9910: 70 42 74 2d 3e 62 75 73 79 48 64 72 29 3b 0a 20  pBt->busyHdr);. 
9920: 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
9930: 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65 33 50  .  .    sqlite3P
9940: 61 67 65 72 53 65 74 44 65 73 74 72 75 63 74 6f  agerSetDestructo
9950: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  r(pBt->pPager, p
9960: 61 67 65 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  ageDestructor);.
9970: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
9980: 53 65 74 52 65 69 6e 69 74 65 72 28 70 42 74 2d  SetReiniter(pBt-
9990: 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52 65 69  >pPager, pageRei
99a0: 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  nit);.    pBt->p
99b0: 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20  Cursor = 0;.    
99c0: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
99d0: 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e  .    pBt->readOn
99e0: 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ly = sqlite3Page
99f0: 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
9a00: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42  >pPager);.    pB
9a10: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 67 65  t->pageSize = ge
9a20: 74 32 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t2byte(&zDbHeade
9a30: 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  r[16]);.    if( 
9a40: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31  pBt->pageSize<51
9a50: 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69  2 || pBt->pageSi
9a60: 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
9a70: 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20  GE_SIZE.        
9a80: 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53   || ((pBt->pageS
9a90: 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65  ize-1)&pBt->page
9aa0: 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Size)!=0 ){.    
9ab0: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
9ac0: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
9ad0: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
9ae0: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
9af0: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  &pBt->pageSize);
9b00: 0a 20 20 20 20 20 20 70 42 74 2d 3e 6d 61 78 45  .      pBt->maxE
9b10: 6d 62 65 64 46 72 61 63 20 3d 20 36 34 3b 20 20  mbedFrac = 64;  
9b20: 20 2f 2a 20 32 35 25 20 2a 2f 0a 20 20 20 20 20   /* 25% */.     
9b30: 20 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72   pBt->minEmbedFr
9b40: 61 63 20 3d 20 33 32 3b 20 20 20 2f 2a 20 31 32  ac = 32;   /* 12
9b50: 2e 35 25 20 2a 2f 0a 20 20 20 20 20 20 70 42 74  .5% */.      pBt
9b60: 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63 20 3d 20  ->minLeafFrac = 
9b70: 33 32 3b 20 20 20 20 2f 2a 20 31 32 2e 35 25 20  32;    /* 12.5% 
9b80: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
9b90: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
9ba0: 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
9bb0: 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
9bc0: 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
9bd0: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
9be0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
9bf0: 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74        ** leave t
9c00: 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f  he autoVacuum mo
9c10: 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20  de at 0 (do not 
9c20: 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76  auto-vacuum), ev
9c30: 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  en if.      ** S
9c40: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
9c50: 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65  TOVACUUM is true
9c60: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
9c70: 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a  and, if.      **
9c80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
9c90: 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
9ca0: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d  efined, then ":m
9cb0: 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
9cc0: 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c  a.      ** regul
9cd0: 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e  ar file-name. In
9ce0: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61   this case the a
9cf0: 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69  uto-vacuum appli
9d00: 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c  es as per normal
9d10: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
9d20: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
9d30: 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
9d40: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
9d50: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
9d60: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
9d70: 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  UM ? 1 : 0);.   
9d80: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
9d90: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
9da0: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
9db0: 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
9dc0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
9dd0: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30      nReserve = 0
9de0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9df0: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44     nReserve = zD
9e00: 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20  bHeader[20];.   
9e10: 20 20 20 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64     pBt->maxEmbed
9e20: 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64 65 72  Frac = zDbHeader
9e30: 5b 32 31 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [21];.      pBt-
9e40: 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d 20  >minEmbedFrac = 
9e50: 7a 44 62 48 65 61 64 65 72 5b 32 32 5d 3b 0a 20  zDbHeader[22];. 
9e60: 20 20 20 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61       pBt->minLea
9e70: 66 46 72 61 63 20 3d 20 7a 44 62 48 65 61 64 65  fFrac = zDbHeade
9e80: 72 5b 32 33 5d 3b 0a 20 20 20 20 20 20 70 42 74  r[23];.      pBt
9e90: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
9ea0: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
9eb0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
9ec0: 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61  UUM.      pBt->a
9ed0: 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
9ee0: 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  4byte(&zDbHeader
9ef0: 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
9f00: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63  ;.      pBt->inc
9f10: 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
9f20: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
9f30: 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
9f40: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
9f50: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
9f60: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
9f70: 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20   - nReserve;.   
9f80: 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70   assert( (pBt->p
9f90: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
9fa0: 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c  );  /* 8-byte al
9fb0: 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53  ignment of pageS
9fc0: 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ize */.    sqlit
9fd0: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
9fe0: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
9ff0: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  &pBt->pageSize);
a000: 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  .   .#if !define
a010: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
a020: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
a030: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a040: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20  MIT_DISKIO).    
a050: 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42  /* Add the new B
a060: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
a070: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
a080: 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61  t sharable BtSha
a090: 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  reds..    */.   
a0a0: 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
a0b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a0c0: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
a0d0: 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d  ared;.      pBt-
a0e0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
a0f0: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
a100: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
a110: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
a120: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
a130: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
a140: 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20  _THREADSAFE ){. 
a150: 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65         pBt->mute
a160: 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
a170: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
a180: 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
a190: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
a1a0: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
a1b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
a1c0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
a1d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a1e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
a1f0: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
a200: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
a210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
a220: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
a230: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
a240: 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
a250: 3d 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  = sqlite3SharedC
a260: 61 63 68 65 4c 69 73 74 3b 0a 20 20 20 20 20 20  acheList;.      
a270: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
a280: 68 65 4c 69 73 74 20 3d 20 70 42 74 3b 0a 20 20  heList = pBt;.  
a290: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
a2a0: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
a2b0: 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
a2c0: 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
a2d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
a2e0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
a2f0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
a300: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
a310: 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
a320: 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
a330: 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
a340: 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
a350: 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
a360: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
a370: 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
a380: 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
a390: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
a3a0: 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
a3b0: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
a3c0: 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
a3d0: 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
a3e0: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
a3f0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
a400: 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
a410: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
a420: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
a430: 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
a440: 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
a450: 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
a460: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
a470: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
a480: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
a490: 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
a4a0: 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70  ( p->pBt<pSib->p
a4b0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
a4c0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
a4d0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
a4e0: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
a4f0: 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
a500: 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
a510: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
a520: 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
a530: 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  && pSib->pNext->
a540: 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20  pBt<p->pBt ){.  
a550: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
a560: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
a570: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a580: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
a590: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
a5a0: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
a5b0: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
a5c0: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
a5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
a5e0: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
a5f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a600: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
a610: 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
a620: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
a630: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a640: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
a650: 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
a660: 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
a670: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a680: 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
a690: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
a6a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
a6b0: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
a6c0: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
a6d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
a6e0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
a6f0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
a700: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
a710: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a720: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
a730: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
a740: 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
a750: 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
a760: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
a770: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
a780: 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
a790: 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
a7a0: 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
a7b0: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
a7c0: 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
a7d0: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
a7e0: 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
a7f0: 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
a800: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
a810: 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
a820: 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
a830: 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
a840: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
a850: 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ACHE.  sqlite3_m
a860: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20  utex *pMaster;. 
a870: 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
a880: 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
a890: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
a8a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
a8b0: 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
a8c0: 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d  ) );.  pMaster =
a8d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
a8e0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
a8f0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
a900: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
a910: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
a920: 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
a930: 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
a940: 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  <=0 ){.    if( s
a950: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
a960: 65 4c 69 73 74 3d 3d 70 42 74 20 29 7b 0a 20 20  eList==pBt ){.  
a970: 20 20 20 20 73 71 6c 69 74 65 33 53 68 61 72 65      sqlite3Share
a980: 64 43 61 63 68 65 4c 69 73 74 20 3d 20 70 42 74  dCacheList = pBt
a990: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
a9a0: 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
a9b0: 3d 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  = sqlite3SharedC
a9c0: 61 63 68 65 4c 69 73 74 3b 0a 20 20 20 20 20 20  acheList;.      
a9d0: 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20  while( pList && 
a9e0: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42  pList->pNext!=pB
a9f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  t ){.        pLi
aa00: 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b  st=pList->pNext;
aa10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
aa20: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
aa30: 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74      pList->pNext
aa40: 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
aa50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
aa60: 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
aa70: 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20  ADSAFE ){.      
aa80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
aa90: 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  ee(pBt->mutex);.
aaa0: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65      }.    remove
aab0: 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 1;.  }.  sql
aac0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
aad0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
aae0: 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c  urn removed;.#el
aaf0: 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  se.  return 1;.#
ab00: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
ab10: 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
ab20: 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
ab30: 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
ab40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ab50: 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
ab60: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
ab70: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
ab80: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
ab90: 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
aba0: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
abb0: 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
abc0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
abd0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
abe0: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
abf0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
ac00: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
ac10: 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
ac20: 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75   pCur = pBt->pCu
ac30: 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  rsor;.  while( p
ac40: 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72  Cur ){.    BtCur
ac50: 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72  sor *pTmp = pCur
ac60: 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75  ;.    pCur = pCu
ac70: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  r->pNext;.    if
ac80: 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d  ( pTmp->pBtree==
ac90: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
aca0: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
acb0: 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a  or(pTmp);.    }.
acc0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61    }..  /* Rollba
acd0: 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72  ck any active tr
ace0: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72  ansaction and fr
acf0: 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74  ee the handle st
ad00: 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
ad10: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
ad20: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29  3BtreeRollback()
ad30: 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65   drops any table
ad40: 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20  -locks held by. 
ad50: 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   ** this handle.
ad60: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
ad70: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  treeRollback(p);
ad80: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
ad90: 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  eave(p);..  /* I
ada0: 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
adb0: 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
adc0: 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
add0: 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
ade0: 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
adf0: 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
ae00: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
ae10: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
ae20: 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
ae30: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
ae40: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
ae50: 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
ae60: 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30   && p->locked==0
ae70: 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   );.  if( !p->sh
ae80: 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65  arable || remove
ae90: 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
aea0: 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
aeb0: 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e  he pBt is no lon
aec0: 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69  ger on the shari
aed0: 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63  ng list, so we c
aee0: 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a  an access.    **
aef0: 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69   it without havi
af00: 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ng to hold the m
af10: 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  utex..    **.   
af20: 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e   ** Clean out an
af30: 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53  d delete the BtS
af40: 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20  hared object..  
af50: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
af60: 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
af70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
af80: 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
af90: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42  ger);.    if( pB
afa0: 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26  t->xFreeSchema &
afb0: 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29  & pBt->pSchema )
afc0: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72  {.      pBt->xFr
afd0: 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53  eeSchema(pBt->pS
afe0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20  chema);.    }.  
aff0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b000: 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
b010: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b020: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
b030: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b040: 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  (pBt);.  }..#ifn
b050: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b060: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61  SHARED_CACHE.  a
b070: 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
b080: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Lock==0 );.  ass
b090: 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  ert( p->locked==
b0a0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  0 );.  if( p->pP
b0b0: 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e  rev ) p->pPrev->
b0c0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
b0d0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
b0e0: 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72   ) p->pNext->pPr
b0f0: 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23  ev = p->pPrev;.#
b100: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
b110: 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75  _free(p);.  retu
b120: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b130: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
b140: 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  e limit on the n
b150: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61  umber of pages a
b160: 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61  llowed in the ca
b170: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  che..**.** The m
b180: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
b190: 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20   cache pages is 
b1a0: 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c  set to the absol
b1b0: 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  ute.** value of 
b1c0: 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61  mxPage.  If mxPa
b1d0: 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
b1e0: 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a  the pager will.*
b1f0: 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68  * operate asynch
b200: 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69  ronously - it wi
b210: 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64  ll not stop to d
b220: 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f  o fsync()s.** to
b230: 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20   insure data is 
b240: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
b250: 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f  isk surface befo
b260: 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67  re.** continuing
b270: 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20  .  Transactions 
b280: 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79  still work if sy
b290: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
b2a0: 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ,.** and the dat
b2b0: 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
b2c0: 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69  corrupted if thi
b2d0: 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61  s program.** cra
b2e0: 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68  shes.  But if th
b2f0: 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
b300: 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68  em crashes or th
b310: 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72  ere is.** an abr
b320: 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72  upt power failur
b330: 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f  e when synchrono
b340: 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64  us is off, the d
b350: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64  atabase.** could
b360: 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
b370: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20  nconsistent and 
b380: 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74  unrecoverable st
b390: 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e  ate..** Synchron
b3a0: 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ous is on by def
b3b0: 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65  ault so database
b3c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e   corruption is n
b3d0: 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61  ot.** normally a
b3e0: 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73   worry..*/.int s
b3f0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
b400: 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
b410: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
b420: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
b430: 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
b440: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
b450: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
b460: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
b470: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
b480: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
b490: 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
b4a0: 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
b4b0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
b4c0: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
b4d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b4e0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
b4f0: 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
b500: 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
b510: 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
b520: 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
b530: 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
b540: 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
b550: 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
b560: 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
b570: 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
b580: 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
b590: 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
b5a0: 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
b5b0: 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
b5c0: 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
b5d0: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
b5e0: 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
b5f0: 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
b600: 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
b610: 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
b620: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
b630: 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
b640: 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
b650: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
b660: 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
b670: 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
b680: 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
b690: 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
b6a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b6b0: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
b6c0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
b6d0: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74  etSafetyLevel(Bt
b6e0: 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65  ree *p, int leve
b6f0: 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29  l, int fullSync)
b700: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
b710: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
b720: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b730: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
b740: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
b750: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
b760: 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
b770: 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
b780: 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65  Bt->pPager, leve
b790: 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  l, fullSync);.  
b7a0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
b7b0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
b7c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
b7d0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
b7e0: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
b7f0: 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
b800: 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
b810: 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
b820: 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
b830: 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
b840: 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
b850: 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
b860: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
b870: 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
b880: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
b890: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
b8a0: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
b8b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
b8c0: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
b8d0: 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
b8e0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
b8f0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
b900: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
b910: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
b920: 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
b930: 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
b940: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
b950: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b960: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
b970: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
b980: 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
b990: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b9a0: 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43  _VACUUM)./*.** C
b9b0: 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
b9c0: 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
b9d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
b9e0: 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
b9f0: 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r page..**.** Th
ba00: 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74  e page size must
ba10: 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
ba20: 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
ba30: 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20   65536.  If the 
ba40: 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70  page.** size sup
ba50: 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d  plied does not m
ba60: 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61  eet this constra
ba70: 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67  int then the pag
ba80: 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a  e size is not.**
ba90: 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20   changed..**.** 
baa0: 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63  Page sizes are c
bab0: 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65  onstrained to be
bac0: 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20   a power of two 
bad0: 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69  so that the regi
bae0: 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  on.** of the dat
baf0: 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20  abase file used 
bb00: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67  for locking (beg
bb10: 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e  inning at PENDIN
bb20: 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66  G_BYTE,.** the f
bb30: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
bb40: 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c  he 1GB boundary,
bb50: 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65   0x40000000) nee
bb60: 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61  ds to occur.** a
bb70: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
bb80: 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  of a page..**.**
bb90: 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52   If parameter nR
bba0: 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74  eserve is less t
bbb0: 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
bbc0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
bbd0: 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70  erved.** bytes p
bbe0: 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  er page is left 
bbf0: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
bc00: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
bc10: 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
bc20: 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
bc30: 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
bc40: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
bc50: 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
bc60: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
bc70: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
bc80: 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
bc90: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
bca0: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
bcb0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
bcc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bcd0: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  _READONLY;.  }. 
bce0: 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
bcf0: 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20  ){.    nReserve 
bd00: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
bd10: 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
bd20: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 67  e;.  }.  if( pag
bd30: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
bd40: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
bd50: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
bd60: 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
bd70: 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
bd80: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
bd90: 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
bda0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
bdb0: 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20  t( !pBt->pPage1 
bdc0: 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  && !pBt->pCursor
bdd0: 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
bde0: 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
bdf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
be00: 65 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ee(pBt->pTmpSpac
be10: 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d  e);.    pBt->pTm
be20: 70 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  pSpace = 0;.    
be30: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
be40: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
be50: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
be60: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  pageSize);.  }. 
be70: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
be80: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
be90: 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 73   - nReserve;.  s
bea0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
beb0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
bec0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
bed0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
bee0: 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
bef0: 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
bf00: 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
bf10: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
bf20: 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
bf30: 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c  eSize;.}.int sql
bf40: 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
bf50: 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
bf60: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
bf70: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
bf80: 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61    n = p->pBt->pa
bf90: 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
bfa0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73  >usableSize;.  s
bfb0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
bfc0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
bfd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
bfe0: 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
bff0: 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62  ount for a datab
c000: 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ase if mxPage is
c010: 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f   positive..** No
c020: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
c030: 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30  e if mxPage is 0
c040: 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   or negative..**
c050: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
c060: 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  he value of mxPa
c070: 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d  ge, return the m
c080: 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
c090: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
c0a0: 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75  3BtreeMaxPageCou
c0b0: 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
c0c0: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
c0d0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
c0e0: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
c0f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
c100: 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74  PageCount(p->pBt
c110: 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
c120: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
c130: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
c140: 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn n;.}.#endif 
c150: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
c160: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
c170: 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
c180: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
c190: 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ACUUM) */../*.**
c1a0: 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
c1b0: 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
c1c0: 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
c1d0: 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
c1e0: 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
c1f0: 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
c200: 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
c210: 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
c220: 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
c230: 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
c240: 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
c250: 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
c260: 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
c270: 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
c280: 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
c290: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
c2a0: 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
c2b0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
c2c0: 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
c2d0: 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
c2e0: 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
c2f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
c300: 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
c310: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
c320: 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
c330: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
c340: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c350: 4b 3b 0a 20 20 69 6e 74 20 61 76 20 3d 20 28 61  K;.  int av = (a
c360: 75 74 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a  utoVacuum?1:0);.
c370: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
c380: 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
c390: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
c3a0: 64 20 26 26 20 61 76 21 3d 70 42 74 2d 3e 61 75  d && av!=pBt->au
c3b0: 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
c3c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
c3d0: 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ONLY;.  }else{. 
c3e0: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
c3f0: 75 6d 20 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73  um = av;.  }.  s
c400: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
c410: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
c420: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
c430: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
c440: 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
c450: 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
c460: 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
c470: 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
c480: 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
c490: 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
c4a0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
c4b0: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
c4c0: 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
c4d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
c4e0: 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
c4f0: 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
c500: 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
c510: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
c520: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
c530: 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
c540: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
c550: 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
c560: 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
c570: 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
c580: 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
c590: 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
c5a0: 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
c5b0: 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
c5c0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
c5d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
c5e0: 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
c5f0: 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
c600: 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
c610: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
c620: 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
c630: 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
c640: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
c650: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
c660: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
c670: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
c680: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
c690: 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
c6a0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
c6b0: 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
c6c0: 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
c6d0: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
c6e0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
c6f0: 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
c700: 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
c710: 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
c720: 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
c730: 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
c740: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
c750: 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
c760: 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
c770: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
c780: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c790: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
c7a0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
c7b0: 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20  if( pBt->pPage1 
c7c0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
c7d0: 4f 4b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OK;.  rc = sqlit
c7e0: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
c7f0: 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
c800: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
c810: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
c820: 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
c830: 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
c840: 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
c850: 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
c860: 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
c870: 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
c880: 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  le. .  */.  rc =
c890: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
c8a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
c8b0: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
c8c0: 3e 70 50 61 67 65 72 29 3e 30 20 29 7b 0a 20 20  >pPager)>0 ){.  
c8d0: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a    int pageSize;.
c8e0: 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69      int usableSi
c8f0: 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
c900: 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
c910: 61 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  a;.    if( memcm
c920: 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
c930: 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
c940: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
c950: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
c960: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
c970: 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
c980: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
c990: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
c9a0: 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
c9b0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
c9c0: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
c9d0: 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69      }.    pageSi
c9e0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 70  ze = get2byte(&p
c9f0: 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69  age1[16]);.    i
ca00: 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
ca10: 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c  &pageSize)!=0 ||
ca20: 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c   pageSize<512 ||
ca30: 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45  .        (SQLITE
ca40: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33  _MAX_PAGE_SIZE<3
ca50: 32 37 36 38 20 26 26 20 70 61 67 65 53 69 7a 65  2768 && pageSize
ca60: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
ca70: 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20  _SIZE).    ){.  
ca80: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
ca90: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
caa0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  }.    assert( (p
cab0: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
cac0: 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  );.    usableSiz
cad0: 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
cae0: 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
caf0: 28 20 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d  ( pageSize!=pBt-
cb00: 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
cb10: 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64     /* After read
cb20: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
cb30: 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
cb40: 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61  se assuming a pa
cb50: 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a  ge size.      **
cb60: 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67   of BtShared.pag
cb70: 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64  eSize, we have d
cb80: 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74  iscovered that t
cb90: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a  he page-size is.
cba0: 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c        ** actuall
cbb0: 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f  y pageSize. Unlo
cbc0: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
cbd0: 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
cbe0: 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a  e1 at.      ** z
cbf0: 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ero and return S
cc00: 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61  QLITE_OK. The ca
cc10: 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74  ller will call t
cc20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  his function.   
cc30: 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
cc40: 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67   the correct pag
cc50: 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f  e-size..      */
cc60: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
cc70: 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
cc80: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
cc90: 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
cca0: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
ccb0: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
ccc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
ccd0: 65 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ee(pBt->pTmpSpac
cce0: 65 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  e);.      pBt->p
ccf0: 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20 20  TmpSpace = 0;.  
cd00: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
cd10: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
cd20: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
cd30: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
cd40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cd50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
cd60: 75 73 61 62 6c 65 53 69 7a 65 3c 35 30 30 20 29  usableSize<500 )
cd70: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
cd80: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
cd90: 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
cda0: 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
cdb0: 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
cdc0: 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
cdd0: 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 6d  Size;.    pBt->m
cde0: 61 78 45 6d 62 65 64 46 72 61 63 20 3d 20 70 61  axEmbedFrac = pa
cdf0: 67 65 31 5b 32 31 5d 3b 0a 20 20 20 20 70 42 74  ge1[21];.    pBt
ce00: 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61 63 20 3d  ->minEmbedFrac =
ce10: 20 70 61 67 65 31 5b 32 32 5d 3b 0a 20 20 20 20   page1[22];.    
ce20: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63  pBt->minLeafFrac
ce30: 20 3d 20 70 61 67 65 31 5b 32 33 5d 3b 0a 23 69   = page1[23];.#i
ce40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ce50: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
ce60: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
ce70: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
ce80: 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
ce90: 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  :0);.    pBt->in
cea0: 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
ceb0: 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
cec0: 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
ced0: 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61  dif.  }..  /* ma
cee0: 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61  xLocal is the ma
cef0: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
cf00: 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65  payload to store
cf10: 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a   locally for.  *
cf20: 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20  * a cell.  Make 
cf30: 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c  sure it is small
cf40: 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
cf50: 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f  at least minFano
cf60: 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61  ut.  ** cells ca
cf70: 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e  n will fit on on
cf80: 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75  e page.  We assu
cf90: 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67  me a 10-byte pag
cfa0: 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42  e header..  ** B
cfb0: 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f  esides the paylo
cfc0: 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73  ad, the cell mus
cfd0: 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20  t store:.  **   
cfe0: 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72    2-byte pointer
cff0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a   to the cell.  *
d000: 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69  *     4-byte chi
d010: 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ld pointer.  ** 
d020: 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20      9-byte nKey 
d030: 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
d040: 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75  -byte nData valu
d050: 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
d060: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
d070: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20  pointer.  ** So 
d080: 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
d090: 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e  of a 2-byte poin
d0a0: 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69  er, a header whi
d0b0: 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73  ch is as much as
d0c0: 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c  .  ** 17 bytes l
d0d0: 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65  ong, 0 to N byte
d0e0: 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e  s of payload, an
d0f0: 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20  d an optional 4 
d100: 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20  byte overflow.  
d110: 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e  ** page pointer.
d120: 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78  .  */.  pBt->max
d130: 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73  Local = (pBt->us
d140: 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 70 42 74  ableSize-12)*pBt
d150: 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61 63 2f 32  ->maxEmbedFrac/2
d160: 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e  55 - 23;.  pBt->
d170: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d  minLocal = (pBt-
d180: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
d190: 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61  pBt->minEmbedFra
d1a0: 63 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42  c/255 - 23;.  pB
d1b0: 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74  t->maxLeaf = pBt
d1c0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
d1d0: 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  5;.  pBt->minLea
d1e0: 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  f = (pBt->usable
d1f0: 53 69 7a 65 2d 31 32 29 2a 70 42 74 2d 3e 6d 69  Size-12)*pBt->mi
d200: 6e 4c 65 61 66 46 72 61 63 2f 32 35 35 20 2d 20  nLeafFrac/255 - 
d210: 32 33 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d  23;.  if( pBt->m
d220: 69 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e 6d 61 78  inLocal>pBt->max
d230: 4c 6f 63 61 6c 20 7c 7c 20 70 42 74 2d 3e 6d 61  Local || pBt->ma
d240: 78 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20 20 20 20  xLocal<0 ){.    
d250: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
d260: 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 20 20 61 73  failed;.  }.  as
d270: 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
d280: 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
d290: 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
d2a0: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
d2b0: 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e  pPage1;.  return
d2c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
d2d0: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a  e1_init_failed:.
d2e0: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
d2f0: 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
d300: 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
d310: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
d320: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
d330: 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65  ks like lockBtre
d340: 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20  e() except that 
d350: 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20  it also invokes 
d360: 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c  the.** busy call
d370: 62 61 63 6b 20 69 66 20 74 68 65 72 65 20 69 73  back if there is
d380: 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
d390: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d3a0: 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74  lockBtreeWithRet
d3b0: 72 79 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b  ry(Btree *pRef){
d3c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
d3d0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
d3e0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
d3f0: 6c 64 73 4d 75 74 65 78 28 70 52 65 66 29 20 29  ldsMutex(pRef) )
d400: 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69 6e  ;.  if( pRef->in
d410: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
d420: 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54 72  E ){.    u8 inTr
d430: 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65 66  ansaction = pRef
d440: 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ->pBt->inTransac
d450: 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65 49  tion;.    btreeI
d460: 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a  ntegrity(pRef);.
d470: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d480: 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
d490: 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70 52  pRef, 0);.    pR
d4a0: 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ef->pBt->inTrans
d4b0: 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73  action = inTrans
d4c0: 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66  action;.    pRef
d4d0: 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
d4e0: 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20  S_NONE;.    if( 
d4f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d500: 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42 74  .      pRef->pBt
d510: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
d520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65  ;.    }.    btre
d530: 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29  eIntegrity(pRef)
d540: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
d550: 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a  c;.}.       ../*
d560: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
d570: 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
d580: 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
d590: 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
d5a0: 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
d5b0: 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
d5c0: 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
d5d0: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
d5e0: 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
d5f0: 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
d600: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
d610: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
d620: 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
d630: 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
d640: 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
d650: 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
d660: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
d670: 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
d680: 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  rs, this routine
d690: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
d6a0: 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
d6b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
d6c0: 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
d6d0: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
d6e0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
d6f0: 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
d700: 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
d710: 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
d720: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d730: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
d740: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
d750: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
d760: 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70  S_NONE && pBt->p
d770: 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74  Cursor==0 && pBt
d780: 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20  ->pPage1!=0 ){. 
d790: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
d7a0: 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
d7b0: 3e 70 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20  >pPager)>=1 ){. 
d7c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
d7d0: 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
d7e0: 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 69  );.#if 0.      i
d7f0: 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  f( pBt->pPage1->
d800: 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20  aData==0 ){.    
d810: 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
d820: 67 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  ge = pBt->pPage1
d830: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
d840: 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
d850: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
d860: 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
d870: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74        pPage->pBt
d880: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
d890: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b  pPage->pgno = 1;
d8a0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
d8b0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
d8c0: 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a  e(pBt->pPage1);.
d8d0: 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
d8e0: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70  Page1 = 0;.    p
d8f0: 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
d900: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65    }.}../*.** Cre
d910: 61 74 65 20 61 20 6e 65 77 20 64 61 74 61 62 61  ate a new databa
d920: 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  se by initializi
d930: 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
d940: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
d950: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d960: 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
d970: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
d980: 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
d990: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
d9a0: 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  a;.  int rc;..  
d9b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d9c0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
d9d0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
d9e0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
d9f0: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
da00: 72 29 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51  r)>0 ) return SQ
da10: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 31 20 3d  LITE_OK;.  pP1 =
da20: 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
da30: 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29  assert( pP1!=0 )
da40: 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e  ;.  data = pP1->
da50: 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
da60: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
da70: 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pP1->pDbPage);. 
da80: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
da90: 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61   rc;.  memcpy(da
daa0: 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  ta, zMagicHeader
dab0: 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  , sizeof(zMagicH
dac0: 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72  eader));.  asser
dad0: 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  t( sizeof(zMagic
dae0: 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20  Header)==16 );. 
daf0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
db00: 31 36 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69  16], pBt->pageSi
db10: 7a 65 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20  ze);.  data[18] 
db20: 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20  = 1;.  data[19] 
db30: 3d 20 31 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20  = 1;.  data[20] 
db40: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
db50: 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
db60: 65 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  e;.  data[21] = 
db70: 70 42 74 2d 3e 6d 61 78 45 6d 62 65 64 46 72 61  pBt->maxEmbedFra
db80: 63 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20  c;.  data[22] = 
db90: 70 42 74 2d 3e 6d 69 6e 45 6d 62 65 64 46 72 61  pBt->minEmbedFra
dba0: 63 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  c;.  data[23] = 
dbb0: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 46 72 61 63  pBt->minLeafFrac
dbc0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
dbd0: 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
dbe0: 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
dbf0: 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
dc00: 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
dc10: 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67  TA );.  pBt->pag
dc20: 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a  eSizeFixed = 1;.
dc30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
dc40: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
dc50: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
dc60: 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  toVacuum==1 || p
dc70: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
dc80: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
dc90: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
dca0: 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61  1 || pBt->incrVa
dcb0: 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74  cuum==0 );.  put
dcc0: 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
dcd0: 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f   4*4], pBt->auto
dce0: 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62  Vacuum);.  put4b
dcf0: 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37  yte(&data[36 + 7
dd00: 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61  *4], pBt->incrVa
dd10: 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  cuum);.#endif.  
dd20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
dd30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
dd40: 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
dd50: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
dd60: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
dd70: 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
dd80: 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
dd90: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
dda0: 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
ddb0: 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
ddc0: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
ddd0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
dde0: 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
ddf0: 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
de00: 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
de10: 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
de20: 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
de30: 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
de40: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
de50: 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
de60: 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
de70: 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
de80: 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
de90: 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
dea0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
deb0: 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
dec0: 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
ded0: 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
dee0: 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
def0: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
df00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
df10: 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
df20: 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
df30: 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
df40: 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
df50: 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
df60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
df70: 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
df80: 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
df90: 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
dfa0: 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
dfb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
dfc0: 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
dfd0: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
dfe0: 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
dff0: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
e000: 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
e010: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
e020: 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
e030: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
e040: 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
e050: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
e060: 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
e070: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e080: 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
e090: 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
e0a0: 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
e0b0: 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
e0c0: 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
e0d0: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
e0e0: 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
e0f0: 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
e100: 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
e110: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
e120: 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
e130: 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
e140: 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
e150: 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
e160: 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
e170: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
e180: 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
e190: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
e1a0: 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
e1b0: 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
e1c0: 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
e1d0: 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
e1e0: 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
e1f0: 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
e200: 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
e210: 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
e220: 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
e230: 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
e240: 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
e250: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
e260: 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
e270: 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
e280: 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
e290: 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
e2a0: 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
e2b0: 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
e2c0: 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
e2d0: 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
e2e0: 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
e2f0: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
e300: 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
e310: 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
e320: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
e330: 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
e340: 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
e350: 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
e360: 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
e370: 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
e380: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
e390: 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
e3a0: 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
e3b0: 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
e3c0: 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
e3d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
e3e0: 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
e3f0: 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
e400: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
e410: 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
e420: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
e430: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
e440: 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
e450: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72  b = p->db;.  btr
e460: 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
e470: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
e480: 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
e490: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
e4a0: 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
e4b0: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
e4c0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
e4d0: 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
e4e0: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
e4f0: 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
e500: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
e510: 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
e520: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
e530: 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
e540: 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
e550: 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
e560: 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
e570: 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
e580: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
e590: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
e5a0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
e5b0: 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  abase */.  if( p
e5c0: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20  Bt->readOnly && 
e5d0: 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
e5e0: 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
e5f0: 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
e600: 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20  ns_begun;.  }.. 
e610: 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
e620: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
e630: 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
e640: 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
e650: 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74  ction .  ** on t
e660: 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
e670: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
e680: 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
e690: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
e6a0: 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74  * requested, ret
e6b0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
e6c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
e6d0: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
e6e0: 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 77  TRANS_WRITE && w
e6f0: 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
e700: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
e710: 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
e720: 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
e730: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
e740: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28  ARED_CACHE.  if(
e750: 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
e760: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
e770: 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42      for(pIter=pB
e780: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
e790: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
e7a0: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
e7b0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70  pIter->pBtree!=p
e7c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e7d0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
e7e0: 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73        goto trans
e7f0: 5f 62 65 67 75 6e 3b 0a 20 20 20 20 20 20 7d 0a  _begun;.      }.
e800: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
e810: 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28  ..  do {.    if(
e820: 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
e830: 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
e840: 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74       rc = lockBt
e850: 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ree(pBt);.      
e860: 7d 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61  }while( pBt->pPa
e870: 67 65 31 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  ge1==0 && rc==SQ
e880: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d  LITE_OK );.    }
e890: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
e8a0: 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
e8b0: 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
e8c0: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
e8d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e8e0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
e8f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e900: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
e910: 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
e920: 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 2c 20  Page1->pDbPage, 
e930: 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20  wrflag>1);.     
e940: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e950: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
e960: 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
e970: 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
e980: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
e990: 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  .  .    if( rc==
e9a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e9b0: 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 20     if( wrflag ) 
e9c0: 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
e9d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e9e0: 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
e9f0: 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
ea00: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  }.  }while( rc==
ea10: 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
ea20: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
ea30: 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
ea40: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ea50: 65 33 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  e3BtreeInvokeBus
ea60: 79 48 61 6e 64 6c 65 72 28 70 42 74 2c 20 30 29  yHandler(pBt, 0)
ea70: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
ea80: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
ea90: 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
eaa0: 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
eab0: 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
eac0: 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ction++;.    }. 
ead0: 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
eae0: 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
eaf0: 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
eb00: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
eb10: 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
eb20: 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
eb30: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
eb40: 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
eb50: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
eb60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
eb70: 44 5f 43 41 43 48 45 0a 20 20 20 20 69 66 28 20  D_CACHE.    if( 
eb80: 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
eb90: 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
eba0: 70 45 78 63 6c 75 73 69 76 65 20 29 3b 0a 20 20  pExclusive );.  
ebb0: 20 20 20 20 70 42 74 2d 3e 70 45 78 63 6c 75 73      pBt->pExclus
ebc0: 69 76 65 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 23  ive = p;.    }.#
ebd0: 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e  endif.  }...tran
ebe0: 73 5f 62 65 67 75 6e 3a 0a 20 20 62 74 72 65 65  s_begun:.  btree
ebf0: 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
ec00: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
ec10: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
ec20: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
ec30: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
ec40: 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
ec50: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
ec60: 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
ec70: 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
ec80: 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
ec90: 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
eca0: 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
ecb0: 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
ecc0: 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
ecd0: 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
ece0: 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
ecf0: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
ed00: 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
ed10: 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
ed20: 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
ed30: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
ed40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
ed60: 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
ed70: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
eda0: 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
edb0: 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
edc0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
edd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ede0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
edf0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
ee00: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
ee10: 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20   int isInitOrig 
ee20: 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
ee30: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
ee40: 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61  Page->pgno;..  a
ee50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
ee60: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
ee70: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
ee80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
ee90: 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
eea0: 65 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  e, pPage->pParen
eeb0: 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
eec0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
eed0: 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
eee0: 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20  rmaps_out;.  }. 
eef0: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
ef00: 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
ef10: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
ef20: 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
ef30: 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
ef40: 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  , i);..    rc = 
ef50: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
ef60: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
ef70: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ef80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
ef90: 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
efa0: 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d  rmaps_out;.    }
efb0: 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
efc0: 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
efd0: 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
efe0: 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
eff0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  ;.      rc = ptr
f000: 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
f010: 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
f020: 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  REE, pgno);.    
f030: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f040: 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f 63  _OK ) goto set_c
f050: 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
f060: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
f070: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
f080: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
f090: 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
f0a0: 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
f0b0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
f0c0: 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 74  8]);.    rc = pt
f0d0: 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
f0e0: 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
f0f0: 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  TREE, pgno);.  }
f100: 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  ..set_child_ptrm
f110: 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65  aps_out:.  pPage
f120: 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
f130: 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20  tOrig;.  return 
f140: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
f150: 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 2c  ewhere on pPage,
f160: 20 77 68 69 63 68 20 69 73 20 67 75 61 72 65 6e   which is guaren
f170: 74 65 65 64 20 74 6f 20 62 65 20 61 20 62 74 72  teed to be a btr
f180: 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20  ee page, not an 
f190: 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
f1a0: 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  , is a pointer t
f1b0: 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f  o page iFrom. Mo
f1c0: 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
f1d0: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
f1e0: 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50  nts to.** iTo. P
f1f0: 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
f200: 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
f210: 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20  e of pointer to 
f220: 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
f230: 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  .** follows:.**.
f240: 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
f250: 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
f260: 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
f270: 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
f280: 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
f290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2a0: 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
f2b0: 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
f2c0: 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
f2d0: 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
f2e0: 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
f2f0: 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
f300: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
f310: 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
f320: 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
f330: 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
f340: 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
f350: 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
f360: 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
f370: 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
f380: 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
f390: 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
f3a0: 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
f3b0: 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
f3c0: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
f3d0: 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
f3e0: 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
f3f0: 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
f400: 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
f410: 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
f420: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f430: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
f440: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 65  utex) );.  if( e
f450: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
f460: 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
f470: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
f480: 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
f490: 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
f4a0: 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
f4b0: 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
f4c0: 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
f4d0: 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
f4e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
f4f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
f500: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34  ;.    }.    put4
f510: 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
f520: 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65  a, iTo);.  }else
f530: 7b 0a 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74  {.    int isInit
f540: 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
f550: 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Init;.    int i;
f560: 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
f570: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
f580: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c  eInitPage(pPage,
f590: 20 30 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d   0);.    nCell =
f5a0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
f5b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
f5c0: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
f5d0: 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
f5e0: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
f5f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
f600: 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
f610: 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
f620: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
f630: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
f640: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
f650: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
f660: 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fo);.        if(
f670: 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
f680: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
f690: 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
f6a0: 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
f6b0: 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20  erflow]) ){.    
f6c0: 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
f6d0: 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
f6e0: 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20  erflow], iTo);. 
f6f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
f700: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
f710: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
f720: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
f730: 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
f740: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
f750: 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
f760: 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
f770: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f780: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f790: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
f7a0: 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
f7b0: 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
f7c0: 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
f7d0: 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
f7e0: 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
f7f0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
f800: 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
f810: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f820: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
f840: 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
f850: 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
f860: 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b  Offset+8], iTo);
f870: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
f880: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
f890: 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65  itOrig;.  }.  re
f8a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f8b0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
f8c0: 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
f8d0: 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f   page pDbPage to
f8e0: 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50   location iFreeP
f8f0: 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64  age in the .** d
f900: 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62  atabase. The pDb
f910: 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72  Page reference r
f920: 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f  emains valid..*/
f930: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f  .static int relo
f940: 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68  catePage(.  BtSh
f950: 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
f960: 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f       /* Btree */
f970: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50  .  MemPage *pDbP
f980: 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  age,        /* O
f990: 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  pen page to move
f9a0: 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f9c0: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74  * Pointer map 't
f9d0: 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70  ype' entry for p
f9e0: 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
f9f0: 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20   iPtrPage,      
fa00: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
fa10: 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e  map 'page-no' en
fa20: 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
fa30: 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50  */.  Pgno iFreeP
fa40: 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
fa50: 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f   The location to
fa60: 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f   move pDbPage to
fa70: 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
fa80: 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
fa90: 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
faa0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
fab0: 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
fac0: 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
fad0: 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
fae0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
faf0: 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
fb00: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
fb10: 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
fb20: 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
fb30: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
fb40: 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
fb50: 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
fb60: 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
fb70: 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
fb80: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fb90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
fba0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
fbb0: 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
fbc0: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
fbd0: 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
fbe0: 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
fbf0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
fc00: 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
fc10: 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
fc20: 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
fc30: 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
fc40: 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
fc50: 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
fc60: 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
fc70: 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
fc80: 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
fc90: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
fca0: 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
fcb0: 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
fcc0: 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
fcd0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
fce0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fcf0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
fd00: 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
fd10: 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
fd20: 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
fd30: 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
fd40: 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
fd50: 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
fd60: 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
fd70: 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
fd80: 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
fd90: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
fda0: 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
fdb0: 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
fdc0: 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
fdd0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
fde0: 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
fdf0: 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
fe00: 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
fe10: 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
fe20: 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
fe30: 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
fe40: 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
fe50: 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
fe60: 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
fe70: 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
fe80: 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
fe90: 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
fea0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
feb0: 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
fec0: 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
fed0: 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
fee0: 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
fef0: 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
ff00: 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
ff10: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ff20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
ff30: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
ff40: 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
ff50: 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
ff60: 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
ff70: 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
ff80: 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
ff90: 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
ffa0: 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
ffb0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
ffc0: 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20  , iFreePage);.  
ffd0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ffe0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
fff0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10000 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
10010 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
10020 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
10030 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
10040 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
10050 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
10060 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
10070 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
10080 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
10090 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
100a0 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
100b0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
100c0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
100d0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
100e0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
100f0 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
10100 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
10110 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10120 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
10130 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
10140 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10150 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
10160 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
10170 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10180 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
10190 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
101a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
101b0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
101c0 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
101d0 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
101e0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
101f0 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
10200 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
10210 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
10220 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10230 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
10240 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
10250 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
10260 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
10270 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10280 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
10290 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
102a0 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
102b0 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
102c0 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
102d0 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
102e0 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
102f0 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
10300 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
10310 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
10320 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
10330 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
10340 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53  ful,.** return S
10350 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
10360 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
10370 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
10380 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69  re no.** point i
10390 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  n calling this f
103a0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
103b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
103c0 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  NE..**.** More s
103d0 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20  pecificly, this 
103e0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
103f0 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
10400 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
10410 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61  e so that the la
10420 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
10430 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
10440 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f   use.** is no lo
10450 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
10460 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70  ** If the nFin p
10470 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
10480 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d  zero, the implem
10490 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73  entation assumes
104a0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c  .** that the cal
104b0 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
104c0 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
104d0 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20  Step() until.** 
104e0 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
104f0 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72  E_DONE or an err
10500 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69  or, and that nFi
10510 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  n is the.** numb
10520 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 65 20  er of pages the 
10530 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
10540 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72  ll contain after
10550 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73   this .** proces
10560 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a  s is complete..*
10570 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
10580 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68  rVacuumStep(BtSh
10590 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
105a0 6e 46 69 6e 29 7b 0a 20 20 50 67 6e 6f 20 69 4c  nFin){.  Pgno iL
105b0 61 73 74 50 67 3b 20 20 20 20 20 20 20 20 20 20  astPg;          
105c0 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20     /* Last page 
105d0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
105e0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  */.  Pgno nFreeL
105f0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
10600 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
10610 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
10620 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
10630 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10640 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10650 75 74 65 78 29 20 29 3b 0a 20 20 69 4c 61 73 74  utex) );.  iLast
10660 50 67 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63  Pg = pBt->nTrunc
10670 3b 0a 20 20 69 66 28 20 69 4c 61 73 74 50 67 3d  ;.  if( iLastPg=
10680 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50  =0 ){.    iLastP
10690 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
106a0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
106b0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pager);.  }..  i
106c0 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
106d0 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
106e0 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
106f0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
10700 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  t) ){.    int rc
10710 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
10720 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
10730 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
10740 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
10750 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
10760 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
10770 46 72 65 65 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e  FreeList==0 || n
10780 46 69 6e 3d 3d 69 4c 61 73 74 50 67 20 29 7b 0a  Fin==iLastPg ){.
10790 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
107a0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
107b0 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
107c0 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67  Get(pBt, iLastPg
107d0 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
107e0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
107f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10800 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10810 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54      }.    if( eT
10820 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
10830 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65  PAGE ){.      re
10840 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10850 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
10860 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
10870 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
10880 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69  ){.      if( nFi
10890 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
108a0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
108b0 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ge from the file
108c0 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  s free-list. Thi
108d0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
108e0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  d.        ** if 
108f0 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  nFin is non-zero
10900 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  . In that case, 
10910 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69  the free-list wi
10920 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
10930 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
10940 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ro after this fu
10950 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20  nction returns, 
10960 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20  so it doesn't . 
10970 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72         ** matter
10980 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e   if it still con
10990 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61  tains some garba
109a0 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20  ge entries..    
109b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
109c0 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20  gno iFreePg;.   
109d0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
109e0 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
109f0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
10a00 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
10a10 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
10a20 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20  LastPg, 1);.    
10a30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10a40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10a50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10a60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10a70 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d  assert( iFreePg=
10a80 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  =iLastPg );.    
10a90 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
10aa0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
10ab0 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
10ac0 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
10ad0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
10ae0 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20  * Index of free 
10af0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61  page to move pLa
10b00 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20  stPg to */.     
10b10 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50   MemPage *pLastP
10b20 67 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  g;..      rc = s
10b30 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
10b40 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
10b50 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
10b60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
10b70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10b80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10b90 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
10ba0 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20  f nFin is zero, 
10bb0 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65  this loop runs e
10bc0 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20  xactly once and 
10bd0 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20  page pLastPg.   
10be0 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64     ** is swapped
10bf0 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
10c00 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64  free page pulled
10c10 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69   off the free li
10c20 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  st..      **.   
10c30 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68     ** On the oth
10c40 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e  er hand, if nFin
10c50 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
10c60 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70   zero, then keep
10c70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e  .      ** loopin
10c80 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70  g until a free-p
10c90 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68  age located with
10ca0 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69  in the first nFi
10cb0 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  n pages.      **
10cc0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
10cd0 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  found..      */.
10ce0 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
10cf0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
10d00 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
10d10 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
10d20 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
10d30 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20  g, &iFreePg, 0, 
10d40 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
10d50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10d60 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
10d70 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
10d80 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
10d90 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
10da0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
10db0 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
10dc0 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e      }while( nFin
10dd0 21 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e  !=0 && iFreePg>n
10de0 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
10df0 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
10e00 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
10e10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10e20 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 61 73  3PagerWrite(pLas
10e30 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  tPg->pDbPage);. 
10e40 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
10e50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10e60 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
10e70 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67  age(pBt, pLastPg
10e80 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
10e90 65 2c 20 69 46 72 65 65 50 67 29 3b 0a 20 20 20  e, iFreePg);.   
10ea0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
10eb0 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
10ec0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
10ed0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10ee0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
10ef0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10f00 0a 0a 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20  ..  pBt->nTrunc 
10f10 3d 20 69 4c 61 73 74 50 67 20 2d 20 31 3b 0a 20  = iLastPg - 1;. 
10f20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 6e 54 72   while( pBt->nTr
10f30 75 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  unc==PENDING_BYT
10f40 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52  E_PAGE(pBt)||PTR
10f50 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
10f60 70 42 74 2d 3e 6e 54 72 75 6e 63 29 20 29 7b 0a  pBt->nTrunc) ){.
10f70 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2d      pBt->nTrunc-
10f80 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  -;.  }.  return 
10f90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10fa0 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
10fb0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
10fc0 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
10fd0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
10fe0 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
10ff0 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
11000 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
11010 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
11020 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
11030 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
11040 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
11050 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
11060 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
11070 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
11080 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
11090 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
110a0 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
110b0 72 20 6f 63 63 75 72 65 64 2c 0a 2a 2a 20 53 51  r occured,.** SQ
110c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
110d0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61  ned. Otherwise a
110e0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
110f0 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ode. .*/.int sql
11100 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63  ite3BtreeIncrVac
11110 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  uum(Btree *p){. 
11120 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
11130 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11140 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t;..  sqlite3Btr
11150 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
11160 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
11170 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
11180 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
11190 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69  NS_WRITE && p->i
111a0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
111b0 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42  ITE );.  if( !pB
111c0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
111d0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
111e0 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DONE;.  }else{.
111f0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
11200 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
11210 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e  Bt);.    rc = in
11220 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
11230 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
11240 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11250 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11260 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
11270 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70  tine is called p
11280 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50  rior to sqlite3P
11290 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20  agerCommit when 
112a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  a transaction.**
112b0 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72   is commited for
112c0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
112d0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
112e0 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
112f0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
11300 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
11310 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
11320 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
11330 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
11340 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
11350 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
11360 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
11370 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
11380 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
11390 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
113a0 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
113b0 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
113c0 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
113d0 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
113e0 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
113f0 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
11400 2a 70 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74  *pnTrunc){.  int
11410 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11420 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
11430 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a   = pBt->pPager;.
11440 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
11450 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69   int nRef = sqli
11460 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
11470 28 70 50 61 67 65 72 29 3b 0a 23 65 6e 64 69 66  (pPager);.#endif
11480 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
11490 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
114a0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
114b0 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
114c0 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
114d0 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
114e0 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
114f0 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
11500 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
11510 46 69 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  Fin = 0;..    if
11520 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30  ( pBt->nTrunc==0
11530 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
11540 46 72 65 65 3b 0a 20 20 20 20 20 20 50 67 6e 6f  Free;.      Pgno
11550 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20   nPtrmap;.      
11560 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
11570 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a   pBt->pageSize;.
11580 20 20 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67        Pgno nOrig
11590 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
115a0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
115b0 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 69 66  ager);..      if
115c0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
115d0 70 42 74 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20  pBt, nOrig) ){. 
115e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
115f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
11600 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
11610 20 69 66 28 20 6e 4f 72 69 67 3d 3d 50 45 4e 44   if( nOrig==PEND
11620 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
11630 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f  t) ){.        nO
11640 72 69 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  rig--;.      }. 
11650 20 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74       nFree = get
11660 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
11670 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
11680 20 20 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20        nPtrmap = 
11690 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
116a0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
116b0 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28  nOrig)+pgsz/5)/(
116c0 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20 20 20 6e  pgsz/5);.      n
116d0 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46  Fin = nOrig - nF
116e0 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20  ree - nPtrmap;. 
116f0 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50       if( nOrig>P
11700 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
11710 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50  (pBt) && nFin<=P
11720 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
11730 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
11740 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d   nFin--;.      }
11750 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 50 54  .      while( PT
11760 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
11770 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
11780 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
11790 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
117a0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20    nFin--;.      
117b0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69  }.    }..    whi
117c0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
117d0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
117e0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
117f0 42 74 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d  Bt, nFin);.    }
11800 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11810 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
11820 20 20 61 73 73 65 72 74 28 6e 46 69 6e 3d 3d 30    assert(nFin==0
11830 20 7c 7c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d   || pBt->nTrunc=
11840 3d 30 20 7c 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d  =0 || nFin<=pBt-
11850 3e 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20  >nTrunc);.      
11860 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11870 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
11880 54 72 75 6e 63 20 26 26 20 6e 46 69 6e 20 29 7b  Trunc && nFin ){
11890 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
118a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
118b0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
118c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
118d0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
118e0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
118f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74   0);.        put
11900 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
11910 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30  e1->aData[36], 0
11920 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
11930 6e 54 72 75 6e 63 20 3d 20 6e 46 69 6e 3b 0a 20  nTrunc = nFin;. 
11940 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11950 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11960 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
11970 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
11980 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
11990 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
119a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
119b0 2a 70 6e 54 72 75 6e 63 20 3d 20 70 42 74 2d 3e  *pnTrunc = pBt->
119c0 6e 54 72 75 6e 63 3b 0a 20 20 20 20 70 42 74 2d  nTrunc;.    pBt-
119d0 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 7d  >nTrunc = 0;.  }
119e0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d  .  assert( nRef=
119f0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66  =sqlite3PagerRef
11a00 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
11a10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11a20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
11a30 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
11a40 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
11a50 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20   of a two-phase 
11a60 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f  commit.  This ro
11a70 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20  utine.** causes 
11a80 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
11a90 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  al to be created
11aa0 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74   (if it does not
11ab0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a   already exist).
11ac0 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ** and populated
11ad0 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66   with enough inf
11ae0 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74  ormation so that
11af0 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73   if a power loss
11b00 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64   occurs.** the d
11b10 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72  atabase can be r
11b20 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
11b30 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79  riginal state by
11b40 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a   playing back.**
11b50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54   the journal.  T
11b60 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hen the contents
11b70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
11b80 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20  are flushed out 
11b90 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20  to.** the disk. 
11ba0 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
11bb0 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20  al is safely on 
11bc0 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67  oxide, the chang
11bd0 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74  es to the.** dat
11be0 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65  abase are writte
11bf0 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  n into the datab
11c00 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75  ase file and flu
11c10 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a  shed to oxide..*
11c20 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
11c30 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72  this call, the r
11c40 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
11c50 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20  still exists on 
11c60 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
11c70 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c  we are still hol
11c80 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20  ding all locks, 
11c90 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  so the transacti
11ca0 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f  on has not.** co
11cb0 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71  mmitted.  See sq
11cc0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
11cd0 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  () for the secon
11ce0 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a  d phase of the.*
11cf0 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  * commit process
11d00 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
11d10 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
11d20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
11d30 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
11d40 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
11d50 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
11d60 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
11d70 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
11d80 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
11d90 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
11da0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
11db0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11dc0 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
11dd0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
11de0 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
11df0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
11e00 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
11e10 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
11e20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
11e30 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
11e40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
11e50 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
11e60 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
11e70 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
11e80 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
11e90 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
11ea0 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
11eb0 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
11ec0 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
11ed0 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
11ee0 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
11ef0 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
11f00 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
11f10 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
11f20 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
11f30 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
11f40 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
11f50 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
11f60 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
11f70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11f80 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
11f90 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  e(Btree *p, cons
11fa0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
11fb0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11fc0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
11fd0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
11fe0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
11ff0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
12000 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 54  pBt;.    Pgno nT
12010 72 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20 73 71  runc = 0;.    sq
12020 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12030 70 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20  p);.    pBt->db 
12040 3d 20 70 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66  = p->db;.#ifndef
12050 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12060 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
12070 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
12080 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
12090 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
120a0 42 74 2c 20 26 6e 54 72 75 6e 63 29 3b 20 0a 20  Bt, &nTrunc); . 
120b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
120c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
120d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
120e0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
120f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
12100 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
12110 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12120 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
12130 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  One(pBt->pPager,
12140 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63   zMaster, nTrunc
12150 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12160 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12170 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
12190 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
121a0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72   currently in pr
121b0 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ogress..**.** Th
121c0 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  is routine imple
121d0 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64  ments the second
121e0 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68   phase of a 2-ph
121f0 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65  ase commit.  The
12200 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
12210 53 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20 64  Sync() routine d
12220 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
12230 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 20 62  ase and should b
12240 65 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 70 72 69  e invoked.** pri
12250 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
12260 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
12270 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
12280 63 28 29 20 72 6f 75 74 69 6e 65 20 64 69 64 0a  c() routine did.
12290 2a 2a 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20  ** all the work 
122a0 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72  of writing infor
122b0 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69  mation out to di
122c0 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20  sk and flushing 
122d0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
122e0 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65  so that they are
122f0 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68   written onto th
12300 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20  e disk platter. 
12310 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75   All this.** rou
12320 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69  tine has to do i
12330 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e  s delete or trun
12340 63 61 74 65 20 74 68 65 20 72 6f 6c 6c 62 61 63  cate the rollbac
12350 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 28 77 68  k journal.** (wh
12360 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
12370 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
12380 6d 6d 69 74 29 20 61 6e 64 20 64 72 6f 70 20 6c  mmit) and drop l
12390 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ocks..**.** This
123a0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
123b0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
123c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
123d0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
123e0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
123f0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
12400 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
12410 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
12420 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
12430 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
12440 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
12450 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
12460 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
12470 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
12480 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65   = p->db;.  btre
12490 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
124a0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
124b0 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74  le has a write-t
124c0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
124d0 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72   commit the shar
124e0 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20  ed-btrees .  ** 
124f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
12500 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
12510 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45  tate to TRANS_RE
12520 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  AD..  */.  if( p
12530 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
12540 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
12550 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  t rc;.    assert
12560 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
12570 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
12580 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
12590 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
125a0 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
125b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
125c0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
125d0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
125e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
125f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12600 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
12610 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12620 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69      }.    pBt->i
12630 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
12640 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 70  RANS_READ;.    p
12650 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
12660 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54    }.  unlockAllT
12670 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20 2f 2a 20  ables(p);..  /* 
12680 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
12690 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72  s any kind of tr
126a0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
126b0 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72  decrement the tr
126c0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63  ansaction.  ** c
126d0 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72  ount of the shar
126e0 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65  ed btree. If the
126f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
12700 6e 74 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  nt reaches 0, se
12710 74 0a 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65  t.  ** the share
12720 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
12730 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
12740 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
12750 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a   call below.  **
12760 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65   will unlock the
12770 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69   pager..  */.  i
12780 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
12790 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
127a0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
127b0 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d  on--;.    if( 0=
127c0 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
127d0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
127e0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
127f0 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
12800 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
12810 20 74 68 65 20 68 61 6e 64 6c 65 73 20 63 75 72   the handles cur
12820 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
12830 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
12840 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a  NONE and unlock.
12850 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69    ** the pager i
12860 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73  f this call clos
12870 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64  ed the only read
12880 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
12890 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d  ction..  */.  p-
128a0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
128b0 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42  _NONE;.  unlockB
128c0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
128d0 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67  );..  btreeInteg
128e0 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
128f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12900 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12910 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
12920 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
12930 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
12940 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
12950 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
12960 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
12970 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
12980 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
12990 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
129a0 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
129b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
129c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
129d0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
129e0 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73  eTwo(p);.  }.  s
129f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12a00 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
12a10 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
12a20 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
12a30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
12a40 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65  rite-cursors ope
12a50 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65  n on this handle
12a60 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
12a70 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
12a80 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
12a90 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
12aa0 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
12ab0 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
12ac0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
12ad0 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
12ae0 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74   routine, a writ
12af0 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  e-cursor is any 
12b00 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
12b10 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69  s capable of wri
12b20 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
12b30 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  bse.  That means
12b40 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a   the cursor was.
12b50 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  ** originally op
12b60 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
12b70 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
12b80 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62  has not be disab
12b90 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67  led.** by having
12ba0 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67   its state chang
12bb0 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  ed to CURSOR_FAU
12bc0 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LT..*/.static in
12bd0 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  t countWriteCurs
12be0 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
12bf0 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
12c00 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
12c10 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
12c20 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
12c30 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
12c40 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  xt){.    if( pCu
12c50 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75  r->wrFlag && pCu
12c60 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
12c70 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
12c80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
12c90 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
12ca0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
12cb0 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
12cc0 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
12cd0 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
12ce0 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
12cf0 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
12d00 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
12d10 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
12d20 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ces..**.** Every
12d30 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70   cursor is tripp
12d40 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
12d50 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e  rsors that belon
12d60 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61  g.** to other da
12d70 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12d80 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
12d90 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  o be sharing.** 
12da0 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
12db0 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
12dc0 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
12dd0 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
12de0 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a  lback occurs..**
12df0 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69   All cursors usi
12e00 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  ng the same cach
12e10 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65  e must be trippe
12e20 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20  d.** to prevent 
12e30 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67  them from trying
12e40 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65   to use the btre
12e50 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72  e after.** the r
12e60 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f  ollback.  The ro
12e70 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
12e80 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a  deleted tables.*
12e90 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20  * or moved root 
12ea0 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20  pages, so it is 
12eb0 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  not sufficient t
12ec0 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74  o.** save the st
12ed0 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
12ee0 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  r.  The cursor m
12ef0 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
12f00 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dated..*/.void s
12f10 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
12f20 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
12f30 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
12f40 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  Code){.  BtCurso
12f50 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42  r *p;.  sqlite3B
12f60 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
12f70 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  );.  for(p=pBtre
12f80 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
12f90 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
12fa0 0a 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72  .    clearCursor
12fb0 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
12fc0 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
12fd0 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70  SOR_FAULT;.    p
12fe0 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65  ->skip = errCode
12ff0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
13000 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
13010 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
13020 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
13030 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
13040 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77  .  All cursors w
13050 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ill be.** invali
13060 64 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ded by this oper
13070 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65  ation.  Any atte
13080 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72  mpt to use a cur
13090 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20  sor.** that was 
130a0 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69  open at the begi
130b0 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70  nning of this op
130c0 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73  eration will res
130d0 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72  ult.** in an err
130e0 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
130f0 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
13100 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
13110 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
13120 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
13130 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
13140 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
13150 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
13160 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
13170 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
13180 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
13190 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
131a0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
131b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
131c0 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  1;..  sqlite3Btr
131d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
131e0 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
131f0 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
13200 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
13210 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13220 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13230 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  E.  if( rc!=SQLI
13240 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
13250 54 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62  This is a horrib
13260 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e  le situation. An
13270 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   IO or malloc() 
13280 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68  error occured wh
13290 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
132a0 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
132b0 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
132c0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
132d0 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
132e0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
132f0 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
13300 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
13310 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
13320 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
13330 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
13340 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
13350 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
13360 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
13370 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
13380 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
13390 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
133a0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
133b0 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
133c0 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
133d0 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
133e0 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
133f0 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
13400 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
13410 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
13420 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
13430 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e  (p, rc);.  }.#en
13440 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67  dif.  btreeInteg
13450 72 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63  rity(p);.  unloc
13460 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a  kAllTables(p);..
13470 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
13480 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
13490 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 23  .    int rc2;..#
134a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
134b0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
134c0 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
134d0 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61  0;.#endif..    a
134e0 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49  ssert( TRANS_WRI
134f0 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73  TE==pBt->inTrans
13500 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63  action );.    rc
13510 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  2 = sqlite3Pager
13520 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50  Rollback(pBt->pP
13530 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
13540 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2!=SQLITE_OK ){
13550 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
13560 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
13570 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20  he rollback may 
13580 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74  have destroyed t
13590 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  he pPage1->aData
135a0 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20   value.  So.    
135b0 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42  ** call sqlite3B
135c0 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
135d0 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
135e0 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
135f0 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
13600 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
13610 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
13620 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
13630 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
13640 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
13650 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
13660 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
13670 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
13680 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72  countWriteCursor
13690 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20  s(pBt)==0 );.   
136a0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
136b0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
136c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
136d0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
136e0 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ONE ){.    asser
136f0 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
13700 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42  tion>0 );.    pB
13710 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
13720 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42  -;.    if( 0==pB
13730 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
13740 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
13750 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
13760 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ANS_NONE;.    }.
13770 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e    }..  p->inTran
13780 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  s = TRANS_NONE;.
13790 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
137a0 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  0;.  unlockBtree
137b0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a  IfUnused(pBt);..
137c0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
137d0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
137e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
137f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13800 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
13810 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
13820 69 6f 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61  ion.  The subtra
13830 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20  nsaction can.** 
13840 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
13850 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
13860 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
13870 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75  nsaction..** You
13880 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
13890 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
138a0 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
138b0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
138c0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
138d0 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
138e0 61 74 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20  atically if the 
138f0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
13900 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  .** commits or r
13910 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
13920 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61   Only one subtra
13930 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  nsaction may be 
13940 61 63 74 69 76 65 20 61 74 20 61 20 74 69 6d 65  active at a time
13950 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f  .  It is an erro
13960 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73  r to try.** to s
13970 74 61 72 74 20 61 20 6e 65 77 20 73 75 62 74 72  tart a new subtr
13980 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f  ansaction if ano
13990 74 68 65 72 20 73 75 62 74 72 61 6e 73 61 63 74  ther subtransact
139a0 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61  ion is already a
139b0 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61  ctive..**.** Sta
139c0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
139d0 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
139e0 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
139f0 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
13a00 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
13a10 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
13a20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
13a30 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
13a40 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
13a50 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
13a60 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
13a70 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
13a80 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
13a90 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
13aa0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
13ab0 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
13ac0 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
13ad0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
13ae0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
13af0 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
13b00 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
13b10 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
13b20 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
13b30 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
13b40 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
13b50 69 66 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21  if( (p->inTrans!
13b60 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c  =TRANS_WRITE) ||
13b70 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a   pBt->inStmt ){.
13b80 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
13b90 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
13ba0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
13bb0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  E_ERROR;.  }else
13bc0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
13bd0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
13be0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
13bf0 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
13c00 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
13c10 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 50 61 67  _OK : sqlite3Pag
13c20 65 72 53 74 6d 74 42 65 67 69 6e 28 70 42 74 2d  erStmtBegin(pBt-
13c30 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42  >pPager);.    pB
13c40 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20  t->inStmt = 1;. 
13c50 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
13c60 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
13c70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
13c80 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 73 74 61  * Commit the sta
13c90 74 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  tment subtransac
13ca0 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
13cb0 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 49 66 20  n progress.  If 
13cc0 6e 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61 63  no.** subtransac
13cd0 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
13ce0 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
13cf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
13d00 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42  treeCommitStmt(B
13d10 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
13d20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
13d30 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
13d40 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
13d50 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
13d60 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  = p->db;.  if( p
13d70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70  Bt->inStmt && !p
13d80 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
13d90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13da0 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
13db0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
13dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
13dd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
13de0 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
13df0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13e00 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13e10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13e20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61 63 74  Rollback the act
13e30 69 76 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  ive statement su
13e40 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49  btransaction.  I
13e50 66 20 6e 6f 20 73 75 62 74 72 61 6e 73 61 63 74  f no subtransact
13e60 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69 76 65  ion.** is active
13e70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
13e80 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
13e90 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  All cursors will
13ea0 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
13eb0 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
13ec0 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 0a  n.  Any attempt.
13ed0 2a 2a 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  ** to use a curs
13ee0 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e  or that was open
13ef0 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
13f00 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74  g of this operat
13f10 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75  ion.** will resu
13f20 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  lt in an error..
13f30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
13f40 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28  reeRollbackStmt(
13f50 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
13f60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13f70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13f80 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
13f90 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
13fa0 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
13fb0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 42 74 2d  ->db;.  if( pBt-
13fc0 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d  >inStmt && !pBt-
13fd0 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
13fe0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
13ff0 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70  erStmtRollback(p
14000 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
14010 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72   assert( countWr
14020 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d  iteCursors(pBt)=
14030 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
14040 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
14050 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
14060 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
14070 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
14080 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
14090 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
140a0 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
140b0 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
140c0 6c 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66 20  le.  The act of 
140d0 61 63 71 75 69 72 69 6e 67 20 61 20 63 75 72 73  acquiring a curs
140e0 6f 72 20 67 65 74 73 20 61 20 72 65 61 64 20 6c  or gets a read l
140f0 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64  ock on .** the d
14100 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
14110 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30  .** If wrFlag==0
14120 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
14130 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73  r can only be us
14140 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  ed for reading..
14150 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c  ** If wrFlag==1,
14160 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
14170 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
14180 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a   reading or for.
14190 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74  ** writing if ot
141a0 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66  her conditions f
141b0 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61  or writing are a
141c0 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a  lso met.  These.
141d0 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69  ** are the condi
141e0 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
141f0 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20  be met in order 
14200 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a  for writing to.*
14210 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a  * be allowed:.**
14220 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73  .** 1:  The curs
14230 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  or must have bee
14240 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  n opened with wr
14250 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a  Flag==1.**.** 2:
14260 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65    Other database
14270 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
14280 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  t share the same
14290 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20   pager cache.** 
142a0 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72      but which ar
142b0 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41  e not in the REA
142c0 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74  D_UNCOMMITTED st
142d0 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ate may not have
142e0 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20  .**     cursors 
142f0 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67  open with wrFlag
14300 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ==0 on the same 
14310 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73  table.  Otherwis
14320 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61  e.**     the cha
14330 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69  nges made by thi
14340 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77  s write cursor w
14350 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20  ould be visible 
14360 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65  to.**     the re
14370 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ad cursors in th
14380 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  e other database
14390 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
143a0 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62  ** 3:  The datab
143b0 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74  ase must be writ
143c0 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61  able (not on rea
143d0 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a  d-only media).**
143e0 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75  .** 4:  There mu
143f0 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20  st be an active 
14400 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
14410 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
14420 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
14430 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
14440 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
14450 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
14460 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
14470 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
14480 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
14490 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
144a0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
144b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
144c0 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
144d0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144f0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
14500 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
14510 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14530 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
14540 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
14550 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
14580 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
14590 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
145a0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
145b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
145c0 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63  * First arg to c
145d0 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
145e0 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  on */.  BtCursor
145f0 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14610 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20  * Space for new 
14620 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69  cursor */.){.  i
14630 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
14640 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
14650 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
14660 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
14670 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20 77  ex(p) );.  if( w
14680 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28  rFlag ){.    if(
14690 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29   pBt->readOnly )
146a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
146b0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
146c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
146d0 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20  eckReadLocks(p, 
146e0 69 54 61 62 6c 65 2c 20 30 29 20 29 7b 0a 20 20  iTable, 0) ){.  
146f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14700 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a  E_LOCKED;.    }.
14710 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e    }..  if( pBt->
14720 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20  pPage1==0 ){.   
14730 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57   rc = lockBtreeW
14740 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20  ithRetry(p);.   
14750 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14760 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
14770 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
14780 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
14790 6c 79 20 26 26 20 77 72 46 6c 61 67 20 29 7b 0a  ly && wrFlag ){.
147a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
147b0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
147c0 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e    }.  }.  pCur->
147d0 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
147e0 29 69 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 69  )iTable;.  if( i
147f0 54 61 62 6c 65 3d 3d 31 20 26 26 20 73 71 6c 69  Table==1 && sqli
14800 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
14810 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
14820 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
14830 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20  LITE_EMPTY;.    
14840 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73  goto create_curs
14850 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20  or_exception;.  
14860 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  }.  rc = getAndI
14870 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75  nitPage(pBt, pCu
14880 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
14890 75 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0a 20  ur->pPage, 0);. 
148a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
148b0 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63  OK ){.    goto c
148c0 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
148d0 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  eption;.  }..  /
148e0 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74  * Now that no ot
148f0 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f  her errors can o
14900 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c  ccur, finish fil
14910 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75  ling in the BtCu
14920 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62  rsor.  ** variab
14930 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75  les, link the cu
14940 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
14950 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64 20  Shared list and 
14960 73 65 74 20 2a 70 70 43 75 72 20 28 74 68 65 0a  set *ppCur (the.
14970 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67 75    ** output argu
14980 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
14990 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70  ction)..  */.  p
149a0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
149b0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
149c0 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
149d0 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
149e0 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  .  pCur->wrFlag 
149f0 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72  = wrFlag;.  pCur
14a00 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
14a10 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43  Cursor;.  if( pC
14a20 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
14a30 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
14a40 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a  rev = pCur;.  }.
14a50 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
14a60 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65   pCur;.  pCur->e
14a70 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
14a80 4e 56 41 4c 49 44 3b 0a 0a 20 20 72 65 74 75 72  NVALID;..  retur
14a90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72  n SQLITE_OK;..cr
14aa0 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65  eate_cursor_exce
14ab0 70 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70 43 75  ption:.  if( pCu
14ac0 72 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  r ){.    release
14ad0 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65  Page(pCur->pPage
14ae0 29 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 42  );.  }.  unlockB
14af0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
14b00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
14b10 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
14b20 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
14b30 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
14b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
14b60 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
14b70 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
14b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b90 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
14ba0 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
14bb0 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
14bc0 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14be0 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
14bf0 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
14c00 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
14c10 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
14c40 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
14c50 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
14c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14c80 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
14c90 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
14ca0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
14cb0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14cc0 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  p->pBt->db = p->
14cd0 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  db;.  rc = btree
14ce0 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65  Cursor(p, iTable
14cf0 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
14d00 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c  fo, pCur);.  sql
14d10 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14d20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
14d30 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
14d40 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 7b 0a  eeCursorSize(){.
14d50 20 20 72 65 74 75 72 6e 20 73 69 7a 65 6f 66 28    return sizeof(
14d60 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 0a 0a  BtCursor);.}....
14d70 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
14d80 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20  rsor.  The read 
14d90 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
14da0 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c  base file is rel
14db0 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  eased.** when th
14dc0 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73  e last cursor is
14dd0 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
14de0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
14df0 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  eCursor(BtCursor
14e00 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
14e10 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
14e20 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70  >pBtree;.  if( p
14e30 42 74 72 65 65 20 29 7b 0a 20 20 20 20 42 74 53  Btree ){.    BtS
14e40 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
14e50 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  r->pBt;.    sqli
14e60 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
14e70 74 72 65 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e  tree);.    pBt->
14e80 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b  db = pBtree->db;
14e90 0a 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72  .    clearCursor
14ea0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
14eb0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
14ec0 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75  rev ){.      pCu
14ed0 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
14ee0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
14ef0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14f00 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
14f10 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
14f20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
14f30 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
14f40 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
14f50 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
14f60 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61  .    }.    relea
14f70 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61  sePage(pCur->pPa
14f80 67 65 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ge);.    unlockB
14f90 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
14fa0 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  );.    invalidat
14fb0 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
14fc0 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  Cur);.    /* sql
14fd0 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
14fe0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
14ff0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
15000 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
15010 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15020 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f  .** Make a tempo
15030 72 61 72 79 20 63 75 72 73 6f 72 20 62 79 20 66  rary cursor by f
15040 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 66 69  illing in the fi
15050 65 6c 64 73 20 6f 66 20 70 54 65 6d 70 43 75 72  elds of pTempCur
15060 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72 61  ..** The tempora
15070 72 79 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  ry cursor is not
15080 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6c   on the cursor l
15090 69 73 74 20 66 6f 72 20 74 68 65 20 42 74 72 65  ist for the Btre
150a0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
150b0 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75  e3BtreeGetTempCu
150c0 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
150d0 43 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a 70  Cur, BtCursor *p
150e0 54 65 6d 70 43 75 72 29 7b 0a 20 20 61 73 73 65  TempCur){.  asse
150f0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
15100 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
15110 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c  memcpy(pTempCur,
15120 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 2a 70   pCur, sizeof(*p
15130 43 75 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75  Cur));.  pTempCu
15140 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  r->pNext = 0;.  
15150 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20  pTempCur->pPrev 
15160 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65 6d 70  = 0;.  if( pTemp
15170 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20  Cur->pPage ){.  
15180 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
15190 66 28 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67  f(pTempCur->pPag
151a0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
151b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
151c0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72   a temporary cur
151d0 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73 20  sor such as was 
151e0 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65 61  made by the Crea
151f0 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f  teTemporaryCurso
15200 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  r().** function 
15210 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  above..*/.void s
15220 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61  qlite3BtreeRelea
15230 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43  seTempCursor(BtC
15240 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
15250 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
15260 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
15270 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50  ;.  if( pCur->pP
15280 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  age ){.    sqlit
15290 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 43 75  e3PagerUnref(pCu
152a0 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50 61 67  r->pPage->pDbPag
152b0 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
152c0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
152d0 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
152e0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
152f0 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
15300 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
15310 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
15320 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
15330 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69  id, call.** sqli
15340 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
15350 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
15360 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
15370 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
15380 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
15390 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
153a0 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
153b0 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
153c0 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
153d0 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   of calls to sql
153e0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
153f0 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37  ll()..**.** 2007
15400 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69  -06-25:  There i
15410 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20  s a bug in some 
15420 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43  versions of MSVC
15430 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a   that cause the.
15440 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63  ** compiler to c
15450 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c  rash when getCel
15460 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65  lInfo() is imple
15470 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72  mented as a macr
15480 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20  o..** But there 
15490 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65  is a measureable
154a0 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65   speed advantage
154b0 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61   to using the ma
154c0 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77  cro on gcc.** (w
154d0 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65  hen less compile
154e0 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
154f0 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20  like -Os or -O0 
15500 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65  are used and the
15510 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20  .** compiler is 
15520 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73  not doing agress
15530 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20  ive inlining.)  
15540 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c  So we use a real
15550 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
15560 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72   MSVC and a macr
15570 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67  o for everything
15580 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23   else.  Ticket #
15590 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  2457..*/.#ifndef
155a0 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
155b0 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
155c0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
155d0 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
155e0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  fo info;.    mem
155f0 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
15600 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
15610 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
15620 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61  seCell(pCur->pPa
15630 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26  ge, pCur->idx, &
15640 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
15650 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  t( memcmp(&info,
15660 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
15670 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
15680 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
15690 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
156a0 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23  Info(x).#endif.#
156b0 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20  ifdef _MSC_VER. 
156c0 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66   /* Use a real f
156d0 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20  unction in MSVC 
156e0 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62  to work around b
156f0 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70  ugs in that comp
15700 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69  iler. */.  stati
15710 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  c void getCellIn
15720 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
15730 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r){.    if( pCur
15740 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
15750 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15760 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
15770 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72  Cur->pPage, pCur
15780 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e  ->idx, &pCur->in
15790 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  fo);.      pCur-
157a0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
157b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
157c0 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
157d0 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
157e0 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74  .#else /* if not
157f0 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f   _MSC_VER */.  /
15800 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e  * Use a macro in
15810 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69   all other compi
15820 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  lers so that the
15830 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c   function is inl
15840 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ined */.#define 
15850 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
15860 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15890 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  \.  if( pCur->in
158a0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20  fo.nSize==0 ){  
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158d0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
158e0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
158f0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
15900 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70  e, pCur->idx, &p
15910 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20  Cur->info);     
15920 20 20 20 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e      \.    pCur->
15930 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20  validNKey = 1;  
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
15970 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20    }else{        
15980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159b0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73          \.    as
159c0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
159d0 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r);             
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a00 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    \.  }.#endif /
15a10 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f  * _MSC_VER */../
15a20 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
15a30 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
15a40 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64  he buffer needed
15a50 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
15a60 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ue of.** the key
15a70 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
15a80 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20   entry.  If the 
15a90 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
15aa0 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
15ab0 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69  alid entry, *pSi
15ac0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  ze is set to 0. 
15ad0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62  .**.** For a tab
15ae0 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b  le with the INTK
15af0 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69  EY flag set, thi
15b00 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
15b10 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73  s the key.** its
15b20 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  elf, not the num
15b30 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
15b40 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  the key..*/.int 
15b50 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
15b60 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
15b70 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  ur, i64 *pSize){
15b80 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
15b90 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
15ba0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
15bb0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72    rc = restoreOr
15bc0 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
15bd0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
15be0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15bf0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
15c00 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
15c10 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
15c20 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
15c30 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
15c40 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
15c50 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
15c60 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   ){.      *pSize
15c70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
15c80 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
15c90 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
15ca0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
15cb0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a  nfo.nKey;.    }.
15cc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
15cd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  .}../*.** Set *p
15ce0 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  Size to the numb
15cf0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64  er of bytes of d
15d00 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79  ata in the entry
15d10 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63   the.** cursor c
15d20 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
15d30 74 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  to.  Always retu
15d40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
15d50 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
15d60 70 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68  possible.  If th
15d70 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
15d80 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69  currently.** poi
15d90 6e 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72  nting to an entr
15da0 79 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70  y (which can hap
15db0 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  pen, for example
15dc0 2c 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61  , if.** the data
15dd0 62 61 73 65 20 69 73 20 65 6d 70 74 79 29 20 74  base is empty) t
15de0 68 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65  hen *pSize is se
15df0 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  t to 0..*/.int s
15e00 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
15e10 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
15e20 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
15e30 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
15e40 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
15e50 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
15e60 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72    rc = restoreOr
15e70 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
15e80 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
15e90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15ea0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
15eb0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
15ec0 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43  OR_INVALID || pC
15ed0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
15ee0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
15ef0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
15f00 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
15f10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74   ){.      /* Not
15f20 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76   pointing at a v
15f30 61 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74  alid entry - set
15f40 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f   *pSize to 0. */
15f50 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
15f60 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
15f70 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
15f80 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53  pCur);.      *pS
15f90 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
15fa0 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20  .nData;.    }.  
15fb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
15fc0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
15fd0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
15fe0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
15ff0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
16000 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  e (parameter.** 
16010 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63  ovfl), this func
16020 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70  tion finds the p
16030 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
16040 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
16050 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
16060 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  st of overflow p
16070 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c  ages. If possibl
16080 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61  e, it uses the a
16090 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f  uto-vacuum.** po
160a0 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69  inter-map data i
160b0 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e  nstead of readin
160c0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
160d0 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f   page ovfl to do
160e0 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61   so. .**.** If a
160f0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
16100 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
16110 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
16120 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a   Otherwise:.**.*
16130 2a 20 55 6e 6c 65 73 73 20 70 50 67 6e 6f 4e 65  * Unless pPgnoNe
16140 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20  xt is NULL, the 
16150 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
16160 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
16170 20 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65   .** page in the
16180 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20   linked list is 
16190 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
161a0 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
161b0 76 66 6c 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  vfl.** is the la
161c0 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c  st page in its l
161d0 69 6e 6b 65 64 20 6c 69 73 74 2c 20 2a 70 50 67  inked list, *pPg
161e0 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f  noNext is set to
161f0 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   zero. .**.** If
16200 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e   ppPage is not N
16210 55 4c 4c 2c 20 2a 70 70 50 61 67 65 20 69 73 20  ULL, *ppPage is 
16220 73 65 74 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  set to the MemPa
16230 67 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f  ge* handle.** fo
16240 72 20 70 61 67 65 20 6f 76 66 6c 2e 20 54 68 65  r page ovfl. The
16250 20 75 6e 64 65 72 6c 79 69 6e 67 20 70 61 67 65   underlying page
16260 72 20 70 61 67 65 20 6d 61 79 20 68 61 76 65 20  r page may have 
16270 62 65 65 6e 20 72 65 71 75 65 73 74 65 64 0a 2a  been requested.*
16280 2a 20 77 69 74 68 20 74 68 65 20 6e 6f 43 6f 6e  * with the noCon
16290 74 65 6e 74 20 66 6c 61 67 20 73 65 74 2c 20 73  tent flag set, s
162a0 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  o the page data 
162b0 61 63 63 65 73 73 61 62 6c 65 20 76 69 61 0a 2a  accessable via.*
162c0 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 20 6d 61  * this handle ma
162d0 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  y not be trusted
162e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
162f0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
16300 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16310 2c 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  , .  Pgno ovfl, 
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16330 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
16340 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ge */.  MemPage 
16350 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
16360 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
16370 50 61 67 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  Page handle */. 
16380 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74   Pgno *pPgnoNext
16390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
163a0 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66   OUT: Next overf
163b0 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
163c0 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78  */.){.  Pgno nex
163d0 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 0;.  int rc;
163e0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
163f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16400 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
16410 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 73 65 20  /* One of these 
16420 6d 75 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c  must not be NULL
16430 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 79  . Otherwise, why
16440 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
16450 69 6f 6e 3f 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion? */.  assert
16460 28 70 70 50 61 67 65 20 7c 7c 20 70 50 67 6e 6f  (ppPage || pPgno
16470 4e 65 78 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Next);..  /* If 
16480 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c  pPgnoNext is NUL
16490 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  L, then this fun
164a0 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  ction is being c
164b0 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 0a  alled to obtain.
164c0 20 20 2a 2a 20 61 20 4d 65 6d 50 61 67 65 2a 20    ** a MemPage* 
164d0 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 2e 20  reference only. 
164e0 4e 6f 20 70 61 67 65 2d 64 61 74 61 20 69 73 20  No page-data is 
164f0 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 69 73  required in this
16500 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   case..  */.  if
16510 28 20 21 70 50 67 6e 6f 4e 65 78 74 20 29 7b 0a  ( !pPgnoNext ){.
16520 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
16530 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
16540 42 74 2c 20 6f 76 66 6c 2c 20 70 70 50 61 67 65  Bt, ovfl, ppPage
16550 2c 20 31 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  , 1);.  }..#ifnd
16560 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
16570 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
16580 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
16590 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
165a0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
165b0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
165c0 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
165d0 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
165e0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
165f0 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
16600 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
16610 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
16620 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
16630 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
16640 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
16650 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
16660 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
16670 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
16680 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
16690 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
166a0 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
166b0 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
166c0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
166d0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
166e0 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
166f0 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
16700 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
16710 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
16720 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
16730 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
16740 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
16750 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
16760 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
16770 75 65 73 73 3c 3d 73 71 6c 69 74 65 33 50 61 67  uess<=sqlite3Pag
16780 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
16790 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
167a0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
167b0 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
167c0 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
167d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
167e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
167f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16800 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 54    }.      if( eT
16810 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
16820 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
16830 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
16840 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
16850 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16860 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 65  #endif..  if( ne
16870 78 74 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 20  xt==0 || ppPage 
16880 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
16890 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20  pPage = 0;..    
168a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
168b0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76  eGetPage(pBt, ov
168c0 66 6c 2c 20 26 70 50 61 67 65 2c 20 6e 65 78 74  fl, &pPage, next
168d0 21 3d 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  !=0);.    assert
168e0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  (rc==SQLITE_OK |
168f0 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20  | pPage==0);.   
16900 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 26 26 20   if( next==0 && 
16910 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16920 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
16930 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
16940 61 74 61 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ata);.    }..   
16950 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20   if( ppPage ){. 
16960 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
16970 50 61 67 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Page;.    }else{
16980 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
16990 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
169a0 0a 20 20 7d 0a 20 20 2a 70 50 67 6e 6f 4e 65 78  .  }.  *pPgnoNex
169b0 74 20 3d 20 6e 65 78 74 3b 0a 0a 20 20 72 65 74  t = next;..  ret
169c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
169d0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
169e0 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61  a buffer to a pa
169f0 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61  ge, or from a pa
16a00 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a  ge to a buffer..
16a10 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69  **.** pPayload i
16a20 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  s a pointer to d
16a30 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61  ata stored on da
16a40 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
16a50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d  age..** If argum
16a60 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65  ent eOp is false
16a70 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74  , then nByte byt
16a80 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  es of data are c
16a90 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50  opied.** from pP
16aa0 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75  ayload to the bu
16ab0 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20  ffer pointed at 
16ac0 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20  by pBuf. If eOp 
16ad0 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e  is true,.** then
16ae0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
16af0 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
16b00 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42  n pDbPage and nB
16b10 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  yte bytes.** of 
16b20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20  data are copied 
16b30 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
16b40 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64  pBuf to pPayload
16b50 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
16b60 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
16b70 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77   success, otherw
16b80 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ise an error cod
16b90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
16ba0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20   copyPayload(.  
16bb0 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20  void *pPayload, 
16bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
16bd0 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74  nter to page dat
16be0 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  a */.  void *pBu
16bf0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
16c00 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
16c10 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
16c20 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
16c30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16c40 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20  f bytes to copy 
16c50 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20  */.  int eOp,   
16c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16c70 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d  * 0 -> copy from
16c80 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79   page, 1 -> copy
16c90 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62   to page */.  Db
16ca0 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20  Page *pDbPage   
16cb0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
16cc0 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c  containing pPayl
16cd0 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  oad */.){.  if( 
16ce0 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  eOp ){.    /* Co
16cf0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66  py data from buf
16d00 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77  fer to page (a w
16d10 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20  rite operation) 
16d20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
16d30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
16d40 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
16d50 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16d60 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
16d70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
16d80 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
16d90 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20   pBuf, nByte);. 
16da0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43   }else{.    /* C
16db0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61  opy data from pa
16dc0 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20  ge to buffer (a 
16dd0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20  read operation) 
16de0 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42  */.    memcpy(pB
16df0 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42  uf, pPayload, nB
16e00 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  yte);.  }.  retu
16e10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16e20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
16e30 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
16e40 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74  read or overwrit
16e50 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  e payload inform
16e60 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65  ation.** for the
16e70 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
16e80 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
16e90 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74  ointing to. If t
16ea0 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65  he eOp.** parame
16eb0 74 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69  ter is 0, this i
16ec0 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69  s a read operati
16ed0 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20  on (data copied 
16ee0 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70  into.** buffer p
16ef0 42 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e  Buf). If it is n
16f00 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65  on-zero, a write
16f10 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72   (data copied fr
16f20 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  om.** buffer pBu
16f30 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61  f)..**.** A tota
16f40 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73  l of "amt" bytes
16f50 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69   are read or wri
16f60 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61  tten beginning a
16f70 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44  t "offset"..** D
16f80 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f  ata is read to o
16f90 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  r from the buffe
16fa0 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  r pBuf..**.** Th
16fb0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
16fc0 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69  not make a disti
16fd0 6e 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b  nction between k
16fe0 65 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20  ey and data..** 
16ff0 49 74 20 6a 75 73 74 20 72 65 61 64 73 20 6f 72  It just reads or
17000 20 77 72 69 74 65 73 20 62 79 74 65 73 20 66 72   writes bytes fr
17010 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61  om the payload a
17020 72 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74  rea.  Data might
17030 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74   .** appear on t
17040 68 65 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20  he main page or 
17050 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
17060 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
17070 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e  rflow .** pages.
17080 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74  .**.** If the Bt
17090 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f  Cursor.isIncrblo
170a0 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20  bHandle flag is 
170b0 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72  set, and the cur
170c0 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65  rent.** cursor e
170d0 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
170e0 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
170f0 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74  ages, this funct
17100 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73  ion.** allocates
17110 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c   space for and l
17120 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20  azily popluates 
17130 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
17140 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65  e-list .** cache
17150 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
17160 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62  .aOverflow). Sub
17170 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73  sequent calls us
17180 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20  e this.** cache 
17190 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20  to make seeking 
171a0 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
171b0 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69  offset more effi
171c0 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  cient..**.** Onc
171d0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
171e0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
171f0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
17200 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69  , it may be.** i
17210 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f  nvalidated if so
17220 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20  me other cursor 
17230 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61  writes to the sa
17240 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a  me table, or if.
17250 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
17260 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66   moved to a diff
17270 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74  erent row. Addit
17280 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f  ionally, in auto
17290 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c  -vacuum.** mode,
172a0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
172b0 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69  vents may invali
172c0 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  date an overflow
172d0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
172e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69  ..**.**   * An i
172f0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
17300 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d  m,.**   * A comm
17310 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75  it in auto_vacuu
17320 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a  m="full" mode,.*
17330 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61  *   * Creating a
17340 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75   table (may requ
17350 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76  ire moving an ov
17360 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f  erflow page)..*/
17370 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65  .static int acce
17380 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  ssPayload(.  BtC
17390 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
173a0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
173b0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
173c0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
173d0 69 6e 74 20 6f 66 66 73 65 74 2c 20 20 20 20 20  int offset,     
173e0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
173f0 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69  ading this far i
17400 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  nto payload */. 
17410 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
17420 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
17430 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f  is many bytes */
17440 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
17450 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65   *pBuf, /* Write
17460 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20   the bytes into 
17470 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a  this buffer */ .
17480 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20    int skipKey,  
17490 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
174a0 20 62 65 67 69 6e 73 20 61 74 20 64 61 74 61 20   begins at data 
174b0 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
174c0 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  */.  int eOp    
174d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
174e0 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
174f0 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
17500 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
17510 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
17520 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17530 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  _OK;.  u32 nKey;
17540 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
17550 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
17560 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
17570 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 70 61       /* Btree pa
17580 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 63 75  ge of current cu
17590 72 73 6f 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rsor entry */.  
175a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
175b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175c0 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
175d0 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
175e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
175f0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
17600 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
17610 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
17620 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
17630 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
17640 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
17650 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
17660 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73  fset>=0 );.  ass
17670 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
17680 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
17690 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
176a0 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
176b0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
176c0 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ll + pCur->info.
176d0 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20  nHeader;.  nKey 
176e0 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  = (pPage->intKey
176f0 20 3f 20 30 20 3a 20 70 43 75 72 2d 3e 69 6e 66   ? 0 : pCur->inf
17700 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20  o.nKey);..  if( 
17710 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f  skipKey ){.    o
17720 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20  ffset += nKey;. 
17730 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b   }.  if( offset+
17740 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d  amt > nKey+pCur-
17750 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b 0a 20  >info.nData ){. 
17760 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20     /* Trying to 
17770 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61  read or write pa
17780 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
17790 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72  e data is an err
177a0 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  or */.    return
177b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
177c0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
177d0 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
177e0 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
177f0 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
17800 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
17810 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
17820 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
17830 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
17840 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
17850 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
17860 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
17870 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
17880 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
17890 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
178a0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
178b0 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
178c0 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
178d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
178e0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
178f0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
17900 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
17910 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
17920 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
17930 0a 20 20 7d 0a 0a 20 20 70 42 74 20 3d 20 70 43  .  }..  pBt = pC
17940 75 72 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 72  ur->pBt;.  if( r
17950 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17960 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
17970 73 74 20 69 6e 74 20 6f 76 66 6c 53 69 7a 65 20  st int ovflSize 
17980 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
17990 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
179a0 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
179b0 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
179c0 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
179d0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
179e0 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
179f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
17a00 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  l]);..#ifndef SQ
17a10 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
17a20 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  OB.    /* If the
17a30 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c   isIncrblobHandl
17a40 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  e flag is set an
17a50 64 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61  d the BtCursor.a
17a60 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a  Overflow[].    *
17a70 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  * has not been a
17a80 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
17a90 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61  te it now. The a
17aa0 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
17ab0 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72  .    ** one entr
17ac0 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
17ad0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
17ae0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
17af0 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  The.    ** page 
17b00 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
17b10 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
17b20 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
17b30 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20  Overflow[0],.   
17b40 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65   ** etc. A value
17b50 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
17b60 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
17b70 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
17b80 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65  own".    ** (the
17b90 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
17ba0 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
17bb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
17bc0 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
17bd0 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  le && !pCur->aOv
17be0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
17bf0 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
17c00 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
17c10 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
17c20 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
17c30 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  vflSize;.      p
17c40 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
17c50 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33   (Pgno *)sqlite3
17c60 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
17c70 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a  f(Pgno)*nOvfl);.
17c80 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20        if( nOvfl 
17c90 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
17ca0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  low ){.        r
17cb0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
17cc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17cd0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
17ce0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
17cf0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
17d00 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
17d10 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
17d20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
17d30 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
17d40 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
17d50 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
17d60 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
17d70 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
17d80 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
17d90 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
17da0 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b  set/ovflSize] ){
17db0 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f  .      iIdx = (o
17dc0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
17dd0 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
17de0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
17df0 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f  w[iIdx];.      o
17e00 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
17e10 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ovflSize);.    }
17e20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72  .#endif..    for
17e30 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( ; rc==SQLITE_O
17e40 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65  K && amt>0 && ne
17e50 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b  xtPage; iIdx++){
17e60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
17e70 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
17e80 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
17e90 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
17ea0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
17eb0 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
17ec0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
17ed0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
17ee0 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72      assert(!pCur
17ef0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
17f00 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72  ] || pCur->aOver
17f10 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
17f20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
17f30 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
17f40 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
17f50 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
17f60 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
17f70 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
17f80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
17f90 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
17fa0 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
17fb0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
17fc0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
17fd0 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
17fe0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
17ff0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
18000 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
18010 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
18020 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
18030 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
18040 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
18050 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
18060 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
18070 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
18080 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
18090 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
180a0 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
180b0 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
180c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
180d0 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20  LOB.        if( 
180e0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
180f0 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
18100 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
18110 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
18120 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
18130 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
18140 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64      } else .#end
18150 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  if.          rc 
18160 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
18170 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
18180 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
18190 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
181a0 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
181b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
181c0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
181d0 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
181e0 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
181f0 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
18200 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
18210 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
18220 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
18230 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
18240 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
18250 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65  /.        DbPage
18260 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20   *pDbPage;.     
18270 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
18280 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
18290 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
182a0 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
182b0 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ge, &pDbPage);. 
182c0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
182d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
182e0 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
182f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
18300 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
18310 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
18320 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
18330 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
18340 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
18350 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
18360 20 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f             a = o
18370 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
18380 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
18390 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
183a0 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
183b0 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
183c0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50  uf, a, eOp, pDbP
183d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
183e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
183f0 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
18400 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
18410 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74 20  ;.          amt 
18420 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20  -= a;.          
18430 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
18440 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18450 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
18460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
18470 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
18480 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18490 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
184a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
184b0 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
184c0 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  he key associate
184d0 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
184e0 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
184f0 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
18500 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
18510 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
18520 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
18530 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
18540 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
18550 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
18560 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
18570 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
18580 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
18590 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
185a0 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
185b0 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
185c0 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
185d0 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
185e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
185f0 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  eKey(BtCursor *p
18600 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
18610 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
18620 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
18630 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
18640 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
18650 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
18660 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
18670 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
18680 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18690 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
186a0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
186b0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
186c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
186d0 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a  ur->pPage!=0 );.
186e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
186f0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
18700 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18710 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18720 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
18730 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
18740 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20  intKey==0 );.   
18750 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
18760 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
18770 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  dx<pCur->pPage->
18780 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
18790 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
187a0 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
187b0 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
187c0 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a  r*)pBuf, 0, 0);.
187d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
187e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
187f0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
18800 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
18810 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
18820 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
18830 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
18840 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
18850 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
18860 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
18870 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
18880 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
18890 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
188a0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
188b0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
188c0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
188d0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
188e0 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
188f0 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
18900 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
18910 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
18920 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
18930 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
18940 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
18950 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
18960 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
18970 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
18980 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
18990 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72    rc = restoreOr
189a0 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
189b0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
189c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
189d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
189e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
189f0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
18a00 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
18a10 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  age!=0 );.    as
18a20 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
18a30 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c  =0 && pCur->idx<
18a40 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
18a50 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  ll );.    rc = a
18a60 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
18a70 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
18a80 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  pBuf, 1, 0);.  }
18a90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18aa0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
18ab0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
18ac0 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
18ad0 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
18ae0 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
18af0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
18b00 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
18b10 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
18b20 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
18b30 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79  e key if skipKey
18b40 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74  ==0 and it point
18b50 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
18b60 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a  ng of data if.**
18b70 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68   skipKey==1.  Th
18b80 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
18b90 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b  s of available k
18ba0 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
18bb0 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74  en.** into *pAmt
18bc0 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20  .  If *pAmt==0, 
18bd0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
18be0 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
18bf0 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70   be.** a valid p
18c00 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ointer..**.** Th
18c10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
18c20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
18c30 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72  It is common for
18c40 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a   the entire key.
18c50 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66  ** and data to f
18c60 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  it on the local 
18c70 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65  page and for the
18c80 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72  re to be no over
18c90 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20  flow.** pages.  
18ca0 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c  When that is so,
18cb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
18cc0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63  n be used to acc
18cd0 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61  ess the.** key a
18ce0 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20  nd data without 
18cf0 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20  making a copy.  
18d00 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f  If the key and/o
18d10 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a  r data spills.**
18d20 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
18d30 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73  ages, then acces
18d40 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20  sPayload() must 
18d50 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73  be used to reass
18d60 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20 6b 65 79  embly.** the key
18d70 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69  /data and copy i
18d80 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f  t into a preallo
18d90 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a  cated buffer..**
18da0 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
18db0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
18dc0 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64   routine looks d
18dd0 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65  irectly into the
18de0 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20   cached.** page 
18df0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
18e00 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74    The data might
18e10 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20   change or move 
18e20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a  the next time.**
18e30 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69   any btree routi
18e40 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
18e50 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
18e60 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74  signed char *fet
18e70 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
18e80 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
18e90 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
18ea0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
18eb0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
18ec0 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20  int *pAmt,      
18ed0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
18ee0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
18ef0 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
18f00 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65   */.  int skipKe
18f10 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65  y          /* re
18f20 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  ad beginning at 
18f30 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20  data if this is 
18f40 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  true */.){.  uns
18f50 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
18f60 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20  load;.  MemPage 
18f70 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b  *pPage;.  u32 nK
18f80 65 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61 6c  ey;.  int nLocal
18f90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
18fa0 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50  r!=0 && pCur->pP
18fb0 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  age!=0 );.  asse
18fc0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
18fd0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
18fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
18ff0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
19000 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  r) );.  pPage = 
19010 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
19020 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
19030 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
19040 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
19050 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
19060 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
19070 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
19080 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ell;.  aPayload 
19090 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48  += pCur->info.nH
190a0 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61  eader;.  if( pPa
190b0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
190c0 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65    nKey = 0;.  }e
190d0 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  lse{.    nKey = 
190e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
190f0 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b  .  }.  if( skipK
19100 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f  ey ){.    aPaylo
19110 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  ad += nKey;.    
19120 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
19130 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65  nfo.nLocal - nKe
19140 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
19150 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
19160 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  nfo.nLocal;.    
19170 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20  if( nLocal>nKey 
19180 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20  ){.      nLocal 
19190 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  = nKey;.    }.  
191a0 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63  }.  *pAmt = nLoc
191b0 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61  al;.  return aPa
191c0 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
191d0 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
191e0 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
191f0 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
19200 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
19210 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
19220 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
19230 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
19240 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
19250 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
19260 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
19270 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
19280 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
19290 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
192a0 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
192b0 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
192c0 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
192d0 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
192e0 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
192f0 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
19300 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
19310 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
19320 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
19330 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
19340 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
19350 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
19360 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
19370 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
19380 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
19390 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
193a0 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
193b0 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
193c0 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
193d0 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
193e0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
193f0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
19400 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
19410 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
19420 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
19430 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
19440 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73  nt *pAmt){.  ass
19450 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
19460 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
19470 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
19480 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19490 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63  ){.    return (c
194a0 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
194b0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
194c0 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 0);.  }.  re
194d0 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20  turn 0;.}.const 
194e0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
194f0 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75  eeDataFetch(BtCu
19500 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
19510 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74  *pAmt){.  assert
19520 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
19530 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
19540 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19550 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
19560 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73      return (cons
19570 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
19580 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
19590 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
195a0 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  n 0;.}.../*.** M
195b0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
195c0 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
195d0 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
195e0 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
195f0 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
19600 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
19610 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
19620 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
19630 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
19640 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
19650 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74   newPgno){.  int
19660 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
19670 70 4e 65 77 50 61 67 65 3b 0a 20 20 4d 65 6d 50  pNewPage;.  MemP
19680 61 67 65 20 2a 70 4f 6c 64 50 61 67 65 3b 0a 20  age *pOldPage;. 
19690 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
196a0 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61   pCur->pBt;..  a
196b0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
196c0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
196d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
196e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
196f0 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20  VALID );.  rc = 
19700 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
19710 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e  Bt, newPgno, &pN
19720 65 77 50 61 67 65 2c 20 70 43 75 72 2d 3e 70 50  ewPage, pCur->pP
19730 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
19740 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 4e   return rc;.  pN
19750 65 77 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e  ewPage->idxParen
19760 74 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20  t = pCur->idx;. 
19770 20 70 4f 6c 64 50 61 67 65 20 3d 20 70 43 75 72   pOldPage = pCur
19780 2d 3e 70 50 61 67 65 3b 0a 20 20 70 4f 6c 64 50  ->pPage;.  pOldP
19790 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
197a0 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  0;.  releasePage
197b0 28 70 4f 6c 64 50 61 67 65 29 3b 0a 20 20 70 43  (pOldPage);.  pC
197c0 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 4e 65 77  ur->pPage = pNew
197d0 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 64  Page;.  pCur->id
197e0 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  x = 0;.  pCur->i
197f0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
19800 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
19810 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77   = 0;.  if( pNew
19820 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b  Page->nCell<1 ){
19830 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19840 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
19850 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
19860 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
19870 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
19880 20 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65   the page is the
19890 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66   virtual root of
198a0 20 69 74 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   its table..**.*
198b0 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 72 6f  * The virtual ro
198c0 6f 74 20 70 61 67 65 20 69 73 20 74 68 65 20 72  ot page is the r
198d0 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 6d 6f 73  oot page for mos
198e0 74 20 74 61 62 6c 65 73 2e 20 20 42 75 74 0a 2a  t tables.  But.*
198f0 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  * for the table 
19900 72 6f 6f 74 65 64 20 6f 6e 20 70 61 67 65 20 31  rooted on page 1
19910 2c 20 73 6f 6d 65 74 69 6d 65 20 74 68 65 20 72  , sometime the r
19920 65 61 6c 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  eal root page.**
19930 20 69 73 20 65 6d 70 74 79 20 65 78 63 65 70 74   is empty except
19940 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70   for the right-p
19950 6f 69 6e 74 65 72 2e 20 20 49 6e 20 73 75 63 68  ointer.  In such
19960 20 63 61 73 65 73 20 74 68 65 0a 2a 2a 20 76 69   cases the.** vi
19970 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
19980 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74  is the page that
19990 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74   the right-point
199a0 65 72 20 6f 66 20 70 61 67 65 0a 2a 2a 20 31 20  er of page.** 1 
199b0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a  is pointing to..
199c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
199d0 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 4d 65  reeIsRootPage(Me
199e0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
199f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
19a00 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
19a10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19a20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
19a30 65 78 29 20 29 3b 0a 20 20 70 50 61 72 65 6e 74  ex) );.  pParent
19a40 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
19a50 74 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74  t;.  if( pParent
19a60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
19a70 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70    if( pParent->p
19a80 67 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e 20 30  gno>1 ) return 0
19a90 3b 0a 20 20 69 66 28 20 67 65 74 32 62 79 74 65  ;.  if( get2byte
19aa0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
19ab0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
19ac0 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74  set+3])==0 ) ret
19ad0 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
19ae0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
19af0 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74   the cursor up t
19b00 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
19b10 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69  e..**.** pCur->i
19b20 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
19b30 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74   cell index that
19b40 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
19b50 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
19b60 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69  page we are comi
19b70 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20  ng from.  If we 
19b80 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  are coming from 
19b90 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  the.** right-mos
19ba0 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65  t child page the
19bb0 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  n pCur->idx is s
19bc0 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74  et to one more t
19bd0 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65  han.** the large
19be0 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a  st cell index..*
19bf0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
19c00 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28  reeMoveToParent(
19c10 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
19c20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
19c30 65 6e 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ent;.  MemPage *
19c40 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 64 78  pPage;.  int idx
19c50 50 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72  Parent;..  asser
19c60 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
19c70 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
19c80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
19c90 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
19ca0 44 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  D );.  pPage = p
19cb0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
19cc0 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20 29  sert( pPage!=0 )
19cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c  ;.  assert( !sql
19ce0 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50  ite3BtreeIsRootP
19cf0 61 67 65 28 70 50 61 67 65 29 20 29 3b 0a 20 20  age(pPage) );.  
19d00 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  pParent = pPage-
19d10 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65  >pParent;.  asse
19d20 72 74 28 20 70 50 61 72 65 6e 74 21 3d 30 20 29  rt( pParent!=0 )
19d30 3b 0a 20 20 69 64 78 50 61 72 65 6e 74 20 3d 20  ;.  idxParent = 
19d40 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74  pPage->idxParent
19d50 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
19d60 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  Ref(pParent->pDb
19d70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65  Page);.  release
19d80 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 70  Page(pPage);.  p
19d90 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 50 61  Cur->pPage = pPa
19da0 72 65 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  rent;.  pCur->in
19db0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
19dc0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
19dd0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
19de0 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69 66 74  Parent->idxShift
19df0 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  ==0 );.  pCur->i
19e00 64 78 20 3d 20 69 64 78 50 61 72 65 6e 74 3b 0a  dx = idxParent;.
19e10 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
19e20 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
19e30 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61  root page.*/.sta
19e40 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
19e50 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
19e60 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
19e70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
19e80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
19e90 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
19ea0 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
19eb0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
19ec0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
19ed0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
19ee0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
19ef0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c  CURSOR_INVALID <
19f00 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
19f10 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
19f20 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20   CURSOR_VALID   
19f30 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
19f40 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
19f50 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20  ( CURSOR_FAULT  
19f60 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   > CURSOR_REQUIR
19f70 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
19f80 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
19f90 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
19fa0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
19fb0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
19fc0 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 72  FAULT ){.      r
19fd0 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
19fe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 65 61  ;.    }.    clea
19ff0 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
1a000 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 52 6f  pCur);.  }.  pRo
1a010 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ot = pCur->pPage
1a020 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 20 26 26  ;.  if( pRoot &&
1a030 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43   pRoot->pgno==pC
1a040 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a  ur->pgnoRoot ){.
1a050 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
1a060 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 7d  t->isInit );.  }
1a070 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20  else{.    if( . 
1a080 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d       SQLITE_OK!=
1a090 28 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74  (rc = getAndInit
1a0a0 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e  Page(pBt, pCur->
1a0b0 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
1a0c0 2c 20 30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  , 0)).    ){.   
1a0d0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1a0e0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1a0f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1a100 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  c;.    }.    rel
1a110 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70  easePage(pCur->p
1a120 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d  Page);.    pCur-
1a130 3e 70 50 61 67 65 20 3d 20 70 52 6f 6f 74 3b 0a  >pPage = pRoot;.
1a140 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78 20    }.  pCur->idx 
1a150 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
1a160 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1a170 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b  Cur->atLast = 0;
1a180 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
1a190 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 52  ey = 0;.  if( pR
1a1a0 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  oot->nCell==0 &&
1a1b0 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
1a1c0 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
1a1d0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
1a1e0 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b  Root->pgno==1 );
1a1f0 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67  .    subpage = g
1a200 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  et4byte(&pRoot->
1a210 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
1a220 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1a230 61 73 73 65 72 74 28 20 73 75 62 70 61 67 65 3e  assert( subpage>
1a240 30 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 );.    pCur->e
1a250 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
1a260 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
1a270 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1a280 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 0a 20   subpage);.  }. 
1a290 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1a2a0 28 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ((pCur->pPage->n
1a2b0 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56  Cell>0)?CURSOR_V
1a2c0 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41  ALID:CURSOR_INVA
1a2d0 4c 49 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  LID);.  return r
1a2e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
1a2f0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
1a300 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   to the left-mos
1a310 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
1a320 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72  eath the.** entr
1a330 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  y to which it is
1a340 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1a350 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ing..**.** The l
1a360 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73  eft-most leaf is
1a370 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
1a380 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d  e smallest key -
1a390 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
1a3a0 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
1a3b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a3c0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42  moveToLeftmost(B
1a3d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1a3e0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
1a3f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a400 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
1a410 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
1a420 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1a430 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1a440 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1a450 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1a460 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
1a470 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
1a480 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1a490 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  e)->leaf ){.    
1a4a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
1a4b0 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
1a4c0 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
1a4d0 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
1a4e0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
1a4f0 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
1a500 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
1a510 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
1a520 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
1a530 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
1a540 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
1a550 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
1a560 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
1a570 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
1a580 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
1a590 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
1a5a0 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
1a5b0 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
1a5c0 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
1a5d0 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
1a5e0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
1a5f0 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
1a600 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
1a610 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
1a620 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
1a630 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
1a640 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
1a650 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
1a660 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
1a670 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
1a680 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
1a690 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
1a6a0 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
1a6b0 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
1a6c0 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
1a6d0 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
1a6e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a6f0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1a700 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1a710 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
1a720 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a730 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
1a740 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
1a750 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1a760 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1a770 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1a780 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1a790 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
1a7a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
1a7b0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1a7c0 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  ge)->leaf ){.   
1a7d0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
1a7e0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1a7f0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1a800 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  8]);.    pCur->i
1a810 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  dx = pPage->nCel
1a820 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
1a830 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
1a840 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  no);.  }.  if( r
1a850 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a860 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1a870 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 31  pPage->nCell - 1
1a880 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
1a890 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1a8a0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1a8b0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1a8c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a8d0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
1a8e0 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
1a8f0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1a900 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1a910 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
1a920 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
1a930 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
1a940 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
1a950 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
1a960 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
1a970 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
1a980 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
1a990 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
1a9a0 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
1a9b0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
1a9c0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1a9d0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1a9e0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1a9f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1aa00 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1aa10 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1aa20 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
1aa30 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
1aa40 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1aa50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1aa60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1aa70 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
1aa80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1aa90 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1aaa0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
1aab0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  Res = 1;.      r
1aac0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1aad0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1aae0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1aaf0 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
1ab00 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
1ab10 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
1ab20 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
1ab30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1ab40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
1ab50 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
1ab60 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
1ab70 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
1ab80 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1ab90 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
1aba0 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
1abb0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
1abc0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
1abd0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
1abe0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
1abf0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1ac00 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
1ac10 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
1ac20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1ac30 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1ac40 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
1ac50 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1ac60 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1ac70 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1ac80 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1ac90 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
1aca0 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   );.  rc = moveT
1acb0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
1acc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1acd0 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53   ){.    if( CURS
1ace0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
1acf0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1ad00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1ad10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
1ad20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1ad30 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
1ad40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
1ad50 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1ad60 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20  R_VALID );.     
1ad70 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1ad80 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
1ad90 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
1ada0 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
1adb0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75  pCur);.      pCu
1adc0 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d  r->atLast = rc==
1add0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1ade0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1adf0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
1ae00 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
1ae10 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
1ae20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
1ae30 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
1ae40 20 62 79 20 70 4b 65 79 2f 6e 4b 65 79 2f 70 55   by pKey/nKey/pU
1ae50 6e 4b 65 79 2e 20 52 65 74 75 72 6e 20 61 20 73  nKey. Return a s
1ae60 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
1ae70 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
1ae80 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  bles, only the n
1ae90 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
1aea0 20 75 73 65 64 2e 20 20 70 4b 65 79 20 0a 2a 2a   used.  pKey .**
1aeb0 20 61 6e 64 20 70 55 6e 4b 65 79 20 6d 75 73 74   and pUnKey must
1aec0 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
1aed0 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 65 69 74  ndex tables, eit
1aee0 68 65 72 20 70 55 6e 4b 65 79 0a 2a 2a 20 6d 75  her pUnKey.** mu
1aef0 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 6b 65  st point to a ke
1af00 79 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  y that has alrea
1af10 64 79 20 62 65 65 6e 20 75 6e 70 61 63 6b 65 64  dy been unpacked
1af20 2c 20 6f 72 20 65 6c 73 65 0a 2a 2a 20 70 4b 65  , or else.** pKe
1af30 79 2f 6e 4b 65 79 20 64 65 73 63 72 69 62 65 73  y/nKey describes
1af40 20 61 20 62 6c 6f 62 20 63 6f 6e 74 61 69 6e 69   a blob containi
1af50 6e 67 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  ng the key..**.*
1af60 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
1af70 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
1af80 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1af90 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
1afa0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
1afb0 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
1afc0 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
1afd0 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
1afe0 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
1aff0 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
1b000 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
1b010 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
1b020 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
1b030 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54  the key..**.** T
1b040 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d  he result of com
1b050 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
1b060 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
1b070 20 77 68 69 63 68 20 74 68 65 0a 2a 2a 20 63 75   which the.** cu
1b080 72 73 6f 72 20 69 73 20 77 72 69 74 74 65 6e 20  rsor is written 
1b090 74 6f 20 2a 70 52 65 73 20 69 66 20 70 52 65 73  to *pRes if pRes
1b0a0 21 3d 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65 61  !=NULL.  The mea
1b0b0 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73 20  ning of.** this 
1b0c0 76 61 6c 75 65 20 69 73 20 61 73 20 66 6f 6c 6c  value is as foll
1b0d0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ows:.**.**     *
1b0e0 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20  pRes<0      The 
1b0f0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
1b100 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
1b110 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
1b120 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
1b130 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b 65  smaller than pKe
1b140 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  y or if the tabl
1b150 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20  e is empty.**   
1b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1b170 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  nd the cursor is
1b180 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20   therefore left 
1b190 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67  point to nothing
1b1a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
1b1b0 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72  s==0     The cur
1b1c0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
1b1d0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
1b1e0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
1b1f0 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c            exactl
1b200 79 20 6d 61 74 63 68 65 73 20 70 4b 65 79 2e 0a  y matches pKey..
1b210 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
1b220 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
1b230 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1b240 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1b250 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1b260 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
1b270 72 20 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2a 0a  r than pKey..**.
1b280 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1b290 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
1b2a0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
1b2b0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1b2c0 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
1b2d0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1b2e0 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
1b2f0 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 66 6f 72   key content for
1b300 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 20 75   indices.  Not u
1b310 73 65 64 20 62 79 20 74 61 62 6c 65 73 20 2a 2f  sed by tables */
1b320 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1b330 64 20 2a 70 55 6e 4b 65 79 2c 2f 2a 20 55 6e 70  d *pUnKey,/* Unp
1b340 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  acked version of
1b350 20 70 4b 65 79 20 2a 2f 0a 20 20 69 36 34 20 6e   pKey */.  i64 n
1b360 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
1b370 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b 65    /* Size of pKe
1b380 79 2e 20 20 4f 72 20 74 68 65 20 6b 65 79 20 66  y.  Or the key f
1b390 6f 72 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69  or tables */.  i
1b3a0 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20  nt biasRight,   
1b3b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
1b3c0 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63  , bias the searc
1b3d0 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
1b3e0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
1b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b400 20 53 65 61 72 63 68 20 72 65 73 75 6c 74 20 66   Search result f
1b410 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lag */.){.  int 
1b420 72 63 3b 0a 20 20 63 68 61 72 20 61 53 70 61 63  rc;.  char aSpac
1b430 65 5b 32 30 30 5d 3b 0a 0a 20 20 61 73 73 65 72  e[200];..  asser
1b440 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1b450 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1b460 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1b470 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
1b480 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
1b490 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
1b4a0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
1b4b0 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
1b4c0 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
1b4d0 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
1b4e0 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
1b4f0 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
1b500 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
1b510 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ork */.  if( pCu
1b520 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1b530 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d  R_VALID && pCur-
1b540 3e 76 61 6c 69 64 4e 4b 65 79 20 26 26 20 70 43  >validNKey && pC
1b550 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
1b560 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  y ){.    if( pCu
1b570 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b  r->info.nKey==nK
1b580 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
1b590 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
1b5a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b5b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1b5c0 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75  r->atLast && pCu
1b5d0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 6e 4b 65  r->info.nKey<nKe
1b5e0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
1b5f0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
1b600 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b610 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 72 63 20     }.  }...  rc 
1b620 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
1b630 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
1b640 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b650 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
1b660 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73  r->pPage );.  as
1b670 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1b680 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
1b690 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1b6a0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1b6b0 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  ){.    *pRes = -
1b6c0 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
1b6d0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1b6e0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  l==0 );.    retu
1b6f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b700 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50  }.  if( pCur->pP
1b710 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
1b720 20 20 20 2f 2a 20 57 65 20 61 72 65 20 67 69 76     /* We are giv
1b730 65 6e 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 20  en an SQL table 
1b740 74 6f 20 73 65 61 72 63 68 2e 20 20 54 68 65 20  to search.  The 
1b750 6b 65 79 20 69 73 20 74 68 65 20 69 6e 74 65 67  key is the integ
1b760 65 72 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64 20  er.    ** rowid 
1b770 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 6e 4b 65  contained in nKe
1b780 79 2e 20 20 70 4b 65 79 20 61 6e 64 20 70 55 6e  y.  pKey and pUn
1b790 4b 65 79 20 73 68 6f 75 6c 64 20 62 6f 74 68 20  Key should both 
1b7a0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 61  be NULL */.    a
1b7b0 73 73 65 72 74 28 20 70 55 6e 4b 65 79 3d 3d 30  ssert( pUnKey==0
1b7c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1b7d0 70 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  pKey==0 );.  }el
1b7e0 73 65 20 69 66 28 20 70 55 6e 4b 65 79 3d 3d 30  se if( pUnKey==0
1b7f0 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
1b800 65 20 74 6f 20 73 65 61 72 63 68 20 61 6e 20 53  e to search an S
1b810 51 4c 20 69 6e 64 65 78 20 75 73 69 6e 67 20 61  QL index using a
1b820 20 6b 65 79 20 65 6e 63 6f 64 65 64 20 61 73 20   key encoded as 
1b830 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2a 20 54  a blob..    ** T
1b840 68 65 20 62 6c 6f 62 20 69 73 20 66 6f 75 6e 64  he blob is found
1b850 20 61 74 20 70 4b 65 79 20 61 6e 64 20 69 73 20   at pKey and is 
1b860 6e 4b 65 79 20 62 79 74 65 73 20 69 6e 20 6c 65  nKey bytes in le
1b870 6e 67 74 68 2e 20 20 55 6e 70 61 63 6b 0a 20 20  ngth.  Unpack.  
1b880 20 20 2a 2a 20 74 68 69 73 20 6b 65 79 20 73 6f    ** this key so
1b890 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65   that we can use
1b8a0 20 69 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65   it. */.    asse
1b8b0 72 74 28 20 70 4b 65 79 21 3d 30 20 29 3b 0a 20  rt( pKey!=0 );. 
1b8c0 20 20 20 70 55 6e 4b 65 79 20 3d 20 73 71 6c 69     pUnKey = sqli
1b8d0 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1b8e0 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
1b8f0 66 6f 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a  fo, nKey, pKey,.
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f     aSpace, sizeo
1b930 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20  f(aSpace));.    
1b940 69 66 28 20 70 55 6e 4b 65 79 3d 3d 30 20 29 20  if( pUnKey==0 ) 
1b950 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1b960 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
1b970 20 20 2f 2a 20 57 65 20 61 72 65 20 74 6f 20 73    /* We are to s
1b980 65 61 72 63 68 20 61 6e 20 53 51 4c 20 69 6e 64  earch an SQL ind
1b990 65 78 20 75 73 69 6e 67 20 61 20 6b 65 79 20 74  ex using a key t
1b9a0 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20 75  hat is already u
1b9b0 6e 70 61 63 6b 65 64 0a 20 20 20 20 2a 2a 20 61  npacked.    ** a
1b9c0 6e 64 20 68 61 6e 64 65 64 20 74 6f 20 75 73 20  nd handed to us 
1b9d0 69 6e 20 70 55 6e 4b 65 79 2e 20 2a 2f 0a 20 20  in pUnKey. */.  
1b9e0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 3d 3d    assert( pKey==
1b9f0 30 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b  0 );.  }.  for(;
1ba00 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c  ;){.    int lwr,
1ba10 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63   upr;.    Pgno c
1ba20 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
1ba30 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
1ba40 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 6e 74  ->pPage;.    int
1ba50 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65   c = -1;  /* pRe
1ba60 73 20 72 65 74 75 72 6e 20 69 66 20 74 61 62 6c  s return if tabl
1ba70 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74 20  e is empty must 
1ba80 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72  be -1 */.    lwr
1ba90 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
1baa0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
1bab0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1bac0 69 6e 74 4b 65 79 20 26 26 20 70 55 6e 4b 65 79  intKey && pUnKey
1bad0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1bae0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1baf0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
1bb00 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1bb10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
1bb20 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20  iasRight ){.    
1bb30 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 75 70    pCur->idx = up
1bb40 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
1bb50 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20      pCur->idx = 
1bb60 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20 20 20  (upr+lwr)/2;.   
1bb70 20 7d 0a 20 20 20 20 69 66 28 20 6c 77 72 3c 3d   }.    if( lwr<=
1bb80 75 70 72 20 29 20 66 6f 72 28 3b 3b 29 7b 0a 20  upr ) for(;;){. 
1bb90 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
1bba0 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34 20 6e  Key;.      i64 n
1bbb0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 70  CellKey;.      p
1bbc0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1bbd0 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  = 0;.      pCur-
1bbe0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
1bbf0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1bc00 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
1bc10 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
1bc20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
1bc30 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
1bc40 75 72 2d 3e 69 64 78 29 20 2b 20 70 50 61 67 65  ur->idx) + pPage
1bc50 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
1bc60 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1bc70 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
1bc80 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d          u32 dumm
1bc90 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  y;.          pCe
1bca0 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  ll += getVarint3
1bcb0 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b  2(pCell, dummy);
1bcc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bcd0 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
1bce0 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
1bcf0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
1bd00 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 6e 4b 65 79  ( nCellKey==nKey
1bd10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
1bd20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
1bd30 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  se if( nCellKey<
1bd40 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  nKey ){.        
1bd50 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    c = -1;.      
1bd60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1bd70 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
1bd80 4b 65 79 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  Key>nKey );.    
1bd90 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20        c = +1;.  
1bda0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1bdb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1bdc0 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20   available;.    
1bdd0 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28      pCellKey = (
1bde0 76 6f 69 64 20 2a 29 66 65 74 63 68 50 61 79 6c  void *)fetchPayl
1bdf0 6f 61 64 28 70 43 75 72 2c 20 26 61 76 61 69 6c  oad(pCur, &avail
1be00 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
1be10 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75    nCellKey = pCu
1be20 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
1be30 20 20 20 20 20 20 69 66 28 20 61 76 61 69 6c 61        if( availa
1be40 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b  ble>=nCellKey ){
1be50 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
1be60 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1be70 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 4b 65 79  Compare(nCellKey
1be80 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 55 6e 4b  , pCellKey, pUnK
1be90 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
1bea0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43  se{.          pC
1beb0 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ellKey = sqlite3
1bec0 5f 6d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 4b 65  _malloc( nCellKe
1bed0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  y );.          i
1bee0 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
1bef0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1bf00 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1bf10 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1bf20 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1bf30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1bf40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1bf50 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
1bf60 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 28  , 0, nCellKey, (
1bf70 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b 65 79 29  void *)pCellKey)
1bf80 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
1bf90 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1bfa0 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 4b 65  dCompare(nCellKe
1bfb0 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 55 6e  y, pCellKey, pUn
1bfc0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
1bfd0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
1bfe0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
1bff0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1c000 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1c010 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c020 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
1c030 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
1c040 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
1c050 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69  llKey;.        i
1c060 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  f( pPage->leafDa
1c070 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ta && !pPage->le
1c080 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
1c090 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b  lwr = pCur->idx;
1c0a0 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
1c0b0 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20   lwr - 1;.      
1c0c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c0d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c0e0 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a      if( pRes ) *
1c0f0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1c100 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c110 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
1c120 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1c130 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c140 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c    }.      if( c<
1c150 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72  0 ){.        lwr
1c160 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a   = pCur->idx+1;.
1c170 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c180 20 20 20 20 20 75 70 72 20 3d 20 70 43 75 72 2d       upr = pCur-
1c190 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  >idx-1;.      }.
1c1a0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
1c1b0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  r ){.        pCu
1c1c0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
1c1d0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
1c1e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1c1f0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20        pCur->idx 
1c200 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20  = (lwr+upr)/2;. 
1c210 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1c220 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20   lwr==upr+1 );. 
1c230 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c240 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
1c250 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
1c260 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
1c270 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
1c280 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
1c290 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
1c2a0 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
1c2b0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1c2c0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1c2d0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
1c2e0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
1c2f0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
1c300 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
1c310 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64    }.    if( chld
1c320 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  Pg==0 ){.      a
1c330 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1c340 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
1c350 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
1c360 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ell );.      if(
1c370 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20   pRes ) *pRes = 
1c380 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
1c390 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
1c3a0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1c3b0 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  h;.    }.    pCu
1c3c0 72 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20  r->idx = lwr;.  
1c3d0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1c3e0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
1c3f0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1c400 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1c410 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
1c420 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
1c430 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69  ) goto moveto_fi
1c440 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f  nish;.  }.moveto
1c450 5f 66 69 6e 69 73 68 3a 0a 20 20 69 66 28 20 70  _finish:.  if( p
1c460 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  Key ){.    /* If
1c470 20 77 65 20 63 72 65 61 74 65 64 20 6f 75 72 20   we created our 
1c480 6f 77 6e 20 75 6e 70 61 63 6b 65 64 20 6b 65 79  own unpacked key
1c490 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
1c4a0 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
1c4b0 64 75 72 65 2c 20 74 68 65 6e 20 64 65 73 74 72  dure, then destr
1c4c0 6f 79 20 74 68 61 74 20 6b 65 79 20 62 65 66 6f  oy that key befo
1c4d0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f  re returning. */
1c4e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c4f0 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
1c500 63 6f 72 64 28 70 55 6e 4b 65 79 29 3b 0a 20 20  cord(pUnKey);.  
1c510 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1c520 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
1c530 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
1c540 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
1c550 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
1c560 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
1c570 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
1c580 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
1c590 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1c5a0 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
1c5b0 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
1c5c0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1c5d0 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
1c5e0 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
1c5f0 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
1c600 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
1c610 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
1c620 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
1c630 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
1c640 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
1c650 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1c660 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
1c670 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
1c680 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
1c690 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
1c6a0 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
1c6b0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
1c6c0 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
1c6d0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
1c6e0 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
1c6f0 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
1c700 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
1c710 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
1c720 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
1c730 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
1c740 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
1c750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1c760 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
1c770 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
1c780 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f  for a cursor..*/
1c790 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
1c7a0 33 42 74 72 65 65 43 75 72 73 6f 72 44 62 28 63  3BtreeCursorDb(c
1c7b0 6f 6e 73 74 20 42 74 43 75 72 73 6f 72 20 2a 70  onst BtCursor *p
1c7c0 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
1c7d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1c7e0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1c7f0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1c800 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 70 42   return pCur->pB
1c810 74 72 65 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a  tree->db;.}../*.
1c820 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
1c830 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
1c840 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1c850 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
1c860 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
1c870 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
1c880 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
1c890 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
1c8a0 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
1c8b0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
1c8c0 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
1c8d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1c8e0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
1c8f0 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e  t *pRes=1..*/.in
1c900 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
1c910 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
1c920 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1c930 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
1c940 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
1c950 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1c960 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1c970 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72    rc = restoreOr
1c980 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
1c990 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
1c9a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c9b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1c9c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1c9d0 52 65 73 21 3d 30 20 29 3b 0a 20 20 70 50 61 67  Res!=0 );.  pPag
1c9e0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1c9f0 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
1ca00 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1ca10 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
1ca20 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
1ca30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1ca40 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
1ca50 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
1ca60 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70  skip = 0;.    *p
1ca70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
1ca80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ca90 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20   }.  pCur->skip 
1caa0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1cab0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
1cac0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1cad0 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
1cae0 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 64  l );..  pCur->id
1caf0 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  x++;.  pCur->inf
1cb00 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1cb10 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1cb20 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
1cb30 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
1cb40 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
1cb50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1cb60 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1cb70 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
1cb80 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1cb90 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1cba0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
1cbb0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1cbc0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
1cbd0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1cbe0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1cbf0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1cc00 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
1cc10 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  o{.      if( sql
1cc20 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50  ite3BtreeIsRootP
1cc30 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20  age(pPage) ){.  
1cc40 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
1cc50 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
1cc60 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1cc70 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
1cc80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1cc90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cca0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1ccb0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
1ccc0 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
1ccd0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d  ur->pPage;.    }
1cce0 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78  while( pCur->idx
1ccf0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
1cd00 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
1cd10 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
1cd20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
1cd30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1cd40 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
1cd50 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
1cd60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cd70 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1cd80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1cd90 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
1cda0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
1cdb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1cdc0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
1cdd0 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
1cde0 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
1cdf0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
1ce00 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
1ce10 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
1ce20 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
1ce30 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1ce40 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
1ce50 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
1ce60 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
1ce70 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
1ce80 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
1ce90 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
1cea0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1ceb0 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
1cec0 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
1ced0 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
1cee0 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
1cef0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
1cf00 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1cf10 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1cf20 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67  nt rc;.  Pgno pg
1cf30 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  no;.  MemPage *p
1cf40 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
1cf50 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1cf60 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
1cf70 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
1cf80 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
1cf90 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
1cfa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cfb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1cfc0 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
1cfd0 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52   0;.  if( CURSOR
1cfe0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
1cff0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
1d000 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
1d010 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d020 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
1d030 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75  kip<0 ){.    pCu
1d040 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20  r->skip = 0;.   
1d050 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1d060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d070 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
1d080 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65  ip = 0;..  pPage
1d090 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1d0a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1d0b0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
1d0c0 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
1d0d0 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  0 );.  if( !pPag
1d0e0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
1d0f0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 20  gno = get4byte( 
1d100 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1d110 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a 20 20  pCur->idx) );.  
1d120 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1d130 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1d140 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1d150 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d160 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
1d170 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
1d180 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
1d190 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69    while( pCur->i
1d1a0 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  dx==0 ){.      i
1d1b0 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
1d1c0 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29  sRootPage(pPage)
1d1d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
1d1e0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1d1f0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
1d200 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1d210 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d220 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1d230 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1d240 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70  eeMoveToParent(p
1d250 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
1d260 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1d270 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
1d280 3e 69 64 78 2d 2d 3b 0a 20 20 20 20 70 43 75 72  >idx--;.    pCur
1d290 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1d2a0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
1d2b0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69  dNKey = 0;.    i
1d2c0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  f( pPage->leafDa
1d2d0 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ta && !pPage->le
1d2e0 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
1d2f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1d300 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
1d310 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1d320 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d330 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
1d340 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74  *pRes = 0;.  ret
1d350 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d360 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1d370 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
1d380 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1d390 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
1d3a0 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
1d3b0 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
1d3c0 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67  ords, sqlite3Pag
1d3d0 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73  erWrite().** has
1d3e0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
1d3f0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20  lled on the new 
1d400 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20  page.)  The new 
1d410 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a  page has also.**
1d420 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
1d430 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67   and the calling
1d440 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70   routine is resp
1d450 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
1d460 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ing.** sqlite3Pa
1d470 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  gerUnref() on th
1d480 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
1d490 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
1d4a0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1d4b0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
1d4c0 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
1d4d0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
1d4e0 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
1d4f0 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20  r.  *ppPage and 
1d500 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66  *pPgno are undef
1d510 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ined in the even
1d520 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
1d530 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20  * Do not invoke 
1d540 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1d550 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69  f() on *ppPage i
1d560 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  f an error is re
1d570 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
1d580 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
1d590 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
1d5a0 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65  , then a (feeble
1d5b0 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  ) effort is made
1d5c0 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
1d5d0 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
1d5e0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
1d5f0 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
1d600 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
1d610 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
1d620 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
1d630 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
1d640 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
1d650 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
1d660 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
1d670 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
1d680 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
1d690 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63  .** If the "exac
1d6a0 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  t" parameter is 
1d6b0 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70  not 0, and the p
1d6c0 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62  age-number nearb
1d6d0 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79  y exists .** any
1d6e0 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
1d6f0 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
1d700 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f  is guarenteed to
1d710 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68   be returned. Th
1d720 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73  is.** is only us
1d730 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ed by auto-vacuu
1d740 6d 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e  m databases when
1d750 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   allocating a ne
1d760 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  w table..*/.stat
1d770 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
1d780 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68  treePage(.  BtSh
1d790 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65  ared *pBt, .  Me
1d7a0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
1d7b0 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
1d7c0 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a  .  Pgno nearby,.
1d7d0 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20    u8 exact.){.  
1d7e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
1d7f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
1d800 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
1d810 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
1d820 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
1d830 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  int k;     /* Nu
1d840 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
1d850 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
1d860 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
1d870 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
1d880 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
1d890 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
1d8a0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1d8b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1d8c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1d8d0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
1d8e0 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34  age1;.  n = get4
1d8f0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1d900 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20  ata[36]);.  if( 
1d910 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
1d920 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
1d930 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
1d940 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
1d950 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
1d960 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
1d970 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
1d980 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
1d990 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
1d9a0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
1d9b0 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20  earby' */.    . 
1d9c0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78     /* If the 'ex
1d9d0 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77  act' parameter w
1d9e0 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75  as true and a qu
1d9f0 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
1da00 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
1da10 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
1da20 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
1da30 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
1da40 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
1da50 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
1da60 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
1da70 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
1da80 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
1da90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1daa0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1dab0 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61  if( exact && nea
1dac0 72 62 79 3c 3d 73 71 6c 69 74 65 33 50 61 67 65  rby<=sqlite3Page
1dad0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
1dae0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
1daf0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
1db00 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
1db10 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1db20 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
1db30 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  um );.      rc =
1db40 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
1db50 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20  nearby, &eType, 
1db60 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1db70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1db80 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1db90 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
1dba0 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  {.        search
1dbb0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
1dbc0 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d  }.      *pPgno =
1dbd0 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23   nearby;.    }.#
1dbe0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65  endif..    /* De
1dbf0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
1dc00 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
1dc10 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
1dc20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
1dc30 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
1dc40 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
1dc50 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
1dc60 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
1dc70 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
1dc80 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1dc90 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
1dca0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1dcb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
1dcc0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1dcd0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29  >aData[36], n-1)
1dce0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
1dcf0 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c  de within this l
1dd00 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20  oop is run only 
1dd10 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61  once if the 'sea
1dd20 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c  rchList' variabl
1dd30 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  e.    ** is not 
1dd40 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  true. Otherwise,
1dd50 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f   it runs once fo
1dd60 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67  r each trunk-pag
1dd70 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e on the.    ** 
1dd80 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20  free-list until 
1dd90 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
1dda0 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20  ' is located..  
1ddb0 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
1ddc0 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
1ddd0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
1dde0 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
1ddf0 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
1de00 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
1de10 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
1de20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1de30 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
1de40 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1de50 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
1de60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1de70 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
1de80 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
1de90 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
1dea0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1deb0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
1dec0 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
1ded0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
1dee0 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ge;.      }..   
1def0 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
1df00 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
1df10 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  ]);.      if( k=
1df20 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
1df30 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
1df40 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
1df50 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
1df60 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
1df70 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
1df80 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
1df90 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
1dfa0 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
1dfb0 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
1dfc0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
1dfd0 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
1dfe0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1dff0 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
1e000 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1e010 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1e020 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1e030 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
1e040 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
1e050 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1e060 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
1e070 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
1e080 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
1e090 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
1e0a0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
1e0b0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
1e0c0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
1e0d0 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
1e0e0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
1e0f0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
1e100 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
1e110 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
1e120 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
1e130 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
1e140 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74   }else if( k>pBt
1e150 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
1e160 20 38 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a   8 ){.        /*
1e170 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f   Value of k is o
1e180 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61  ut of range.  Da
1e190 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1e1a0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  n */.        rc 
1e1b0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1e1c0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
1e1d0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1e1e0 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53  _page;.#ifndef S
1e1f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1e200 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73  ACUUM.      }els
1e210 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74  e if( searchList
1e220 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75   && nearby==iTru
1e230 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
1e240 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
1e250 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
1e260 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
1e270 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
1e280 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
1e290 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
1e2a0 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
1e2b0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
1e2c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
1e2d0 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75  rt( *pPgno==iTru
1e2e0 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  nk );.        *p
1e2f0 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
1e300 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
1e310 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
1e320 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e330 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
1e340 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1e350 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1e360 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1e370 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1e380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1e390 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( k==0 ){.     
1e3a0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
1e3b0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
1e3c0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1e3d0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
1e3e0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
1e3f0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
1e400 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e410 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76     memcpy(&pPrev
1e420 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1e430 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
1e440 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
1e450 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1e460 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1e470 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  The trunk page i
1e480 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
1e490 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20  e caller but it 
1e4a0 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20  contains .      
1e4b0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20      ** pointers 
1e4c0 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  to free-list lea
1e4d0 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c  ves. The first l
1e4e0 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72  eaf becomes a tr
1e4f0 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unk.          **
1e500 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
1e510 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
1e520 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61  .          MemPa
1e530 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20  ge *pNewTrunk;. 
1e540 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e           Pgno iN
1e550 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79  ewTrunk = get4by
1e560 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
1e570 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  a[8]);.         
1e580 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1e590 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1e5a0 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
1e5b0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
1e5c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e5d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e5e0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1e5f0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1e600 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e610 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e620 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
1e630 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
1e640 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1e650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e660 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1e670 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
1e680 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
1e690 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1e6a0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1e6b0 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
1e6c0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
1e6d0 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
1e6e0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1e6f0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1e700 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
1e710 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
1e720 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1e730 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
1e740 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
1e750 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
1e760 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
1e770 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
1e780 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
1e790 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
1e7a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1e7b0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1e7c0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
1e7d0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
1e7e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e7f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e800 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
1e810 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
1e820 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1e830 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1e840 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1e850 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1e860 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e870 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1e880 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
1e890 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
1e8a0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
1e8b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e8c0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
1e8d0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
1e8e0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
1e8f0 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
1e900 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
1e910 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
1e920 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e930 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
1e940 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
1e950 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
1e960 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20   int closest;.  
1e970 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
1e980 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
1e990 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
1e9a0 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
1e9b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1e9c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1e9d0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
1e9e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
1e9f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
1ea00 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1ea10 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
1ea20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
1ea30 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
1ea40 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20   int i, dist;.  
1ea50 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
1ea60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
1ea70 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
1ea80 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
1ea90 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  by;.          if
1eaa0 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20  ( dist<0 ) dist 
1eab0 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20  = -dist;.       
1eac0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b     for(i=1; i<k;
1ead0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1eae0 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34     int d2 = get4
1eaf0 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
1eb00 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20  4]) - nearby;.  
1eb10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
1eb20 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20  <0 ) d2 = -d2;. 
1eb30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
1eb40 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20  2<dist ){.      
1eb50 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
1eb60 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
1eb70 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
1eb80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1eb90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1eba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1ebb0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
1ebc0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1ebd0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
1ebe0 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
1ebf0 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
1ec00 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
1ec10 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  || iPage==nearby
1ec20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
1ec30 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20  Pgno = iPage;.  
1ec40 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 50 67          if( *pPg
1ec50 6e 6f 3e 73 71 6c 69 74 65 33 50 61 67 65 72 50  no>sqlite3PagerP
1ec60 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1ec70 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
1ec80 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67       /* Free pag
1ec90 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  e off the end of
1eca0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
1ecb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1ecc0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1ecd0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
1ece0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1ecf0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
1ed00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41   }.          TRA
1ed10 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1ed20 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
1ed30 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
1ed40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ed50 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
1ed60 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
1ed80 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
1ed90 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
1eda0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
1edb0 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
1edc0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
1edd0 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
1ede0 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
1edf0 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
1ee00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ee10 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1ee20 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
1ee30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1ee40 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
1ee50 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
1ee60 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20  ppPage, 1);.    
1ee70 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ee80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ee90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1eea0 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
1eeb0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
1eec0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1eed0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1eee0 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
1eef0 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
1ef00 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1ef10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
1ef30 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
1ef40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1ef50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ef60 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
1ef70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1ef80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1ef90 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
1efa0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
1efb0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
1efc0 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
1efd0 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
1efe0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
1eff0 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
1f000 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72   freelist, so cr
1f010 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
1f020 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  at the.    ** en
1f030 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  d of the file */
1f040 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 73 71  .    *pPgno = sq
1f050 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1f060 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
1f070 20 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53   + 1;..#ifndef S
1f080 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1f090 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
1f0a0 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20  t->nTrunc ){.   
1f0b0 20 20 20 2f 2a 20 41 6e 20 69 6e 63 72 2d 76 61     /* An incr-va
1f0c0 63 75 75 6d 20 68 61 73 20 61 6c 72 65 61 64 79  cuum has already
1f0d0 20 72 75 6e 20 77 69 74 68 69 6e 20 74 68 69 73   run within this
1f0e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f   transaction. So
1f0f0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61   the.      ** pa
1f100 67 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 69  ge to allocate i
1f110 73 20 6e 6f 74 20 66 72 6f 6d 20 74 68 65 20 70  s not from the p
1f120 68 79 73 69 63 61 6c 20 65 6e 64 20 6f 66 20 74  hysical end of t
1f130 68 65 20 66 69 6c 65 2c 20 62 75 74 0a 20 20 20  he file, but.   
1f140 20 20 20 2a 2a 20 61 74 20 70 42 74 2d 3e 6e 54     ** at pBt->nT
1f150 72 75 6e 63 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  runc. .      */.
1f160 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70        *pPgno = p
1f170 42 74 2d 3e 6e 54 72 75 6e 63 2b 31 3b 0a 20 20  Bt->nTrunc+1;.  
1f180 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d      if( *pPgno==
1f190 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1f1a0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1f1b0 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20    (*pPgno)++;.  
1f1c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f1d0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1f1e0 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
1f1f0 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f  PAGE(pBt, *pPgno
1f200 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
1f210 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
1f220 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
1f230 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
1f240 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
1f250 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
1f260 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
1f270 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
1f280 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
1f290 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
1f2a0 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
1f2b0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
1f2c0 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
1f2d0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
1f2e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1f2f0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1f300 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
1f310 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d   file (pointer-m
1f320 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50  ap page)\n", *pP
1f330 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73  gno));.      ass
1f340 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
1f350 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1f360 42 74 29 20 29 3b 0a 20 20 20 20 20 20 28 2a 70  Bt) );.      (*p
1f370 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69  Pgno)++;.      i
1f380 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49  f( *pPgno==PENDI
1f390 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1f3a0 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b  ) ){ (*pPgno)++;
1f3b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1f3c0 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a   pBt->nTrunc ){.
1f3d0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e        pBt->nTrun
1f3e0 63 20 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20 20 20  c = *pPgno;.    
1f3f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73  }.#endif..    as
1f400 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
1f410 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1f420 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  pBt) );.    rc =
1f430 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1f440 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
1f450 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , ppPage, 0);.  
1f460 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1f470 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
1f480 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f490 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
1f4a0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1f4b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f4c0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1f4d0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  (*ppPage);.    }
1f4e0 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
1f4f0 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
1f500 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
1f510 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
1f520 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
1f530 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1f540 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
1f550 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
1f560 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
1f570 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
1f580 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
1f590 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f5a0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70 61 67 65  /*.** Add a page
1f5b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f5c0 20 66 69 6c 65 20 74 6f 20 74 68 65 20 66 72 65   file to the fre
1f5d0 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c  elist..**.** sql
1f5e0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
1f5f0 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66   is NOT called f
1f600 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
1f610 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65  tic int freePage
1f620 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
1f630 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1f640 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
1f650 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1f660 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1f670 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b  .  int rc, n, k;
1f680 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74  ..  /* Prepare t
1f690 68 65 20 70 61 67 65 20 66 6f 72 20 66 72 65 65  he page for free
1f6a0 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ing */.  assert(
1f6b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1f6c0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1f6d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1f6e0 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e  rt( pPage->pgno>
1f6f0 31 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  1 );.  pPage->is
1f700 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65  Init = 0;.  rele
1f710 61 73 65 50 61 67 65 28 70 50 61 67 65 2d 3e 70  asePage(pPage->p
1f720 50 61 72 65 6e 74 29 3b 0a 20 20 70 50 61 67 65  Parent);.  pPage
1f730 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 0a  ->pParent = 0;..
1f740 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1f750 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
1f760 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
1f770 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f780 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1f790 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
1f7a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1f7b0 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
1f7c0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1f7d0 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
1f7e0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1f7f0 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65  6], n+1);..#ifde
1f800 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
1f810 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74  DELETE.  /* If t
1f820 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  he SQLITE_SECURE
1f830 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d  _DELETE compile-
1f840 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  time option is e
1f850 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a  nabled, then.  *
1f860 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
1f870 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
1f880 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
1f890 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20  h zeros..  */.  
1f8a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f8b0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
1f8c0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
1f8d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f8e0 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
1f8f0 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
1f900 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23  Bt->pageSize);.#
1f910 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
1f920 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1f930 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68  ACUUM.  /* If th
1f940 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
1f950 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
1f960 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
1f970 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
1f980 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
1f990 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
1f9a0 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
1f9b0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1f9c0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
1f9d0 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
1f9e0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50 54   pPage->pgno, PT
1f9f0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
1fa00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1fa10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
1fa20 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 3d 3d  endif..  if( n==
1fa30 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
1fa40 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66 72   is the first fr
1fa50 65 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72  ee page */.    r
1fa60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fa70 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
1fa80 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1fa90 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1faa0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
1fab0 3e 61 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20  >aData, 0, 8);. 
1fac0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1fad0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1fae0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
1faf0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
1fb00 41 47 45 3a 20 25 64 20 66 69 72 73 74 5c 6e 22  AGE: %d first\n"
1fb10 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  , pPage->pgno));
1fb20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1fb30 20 4f 74 68 65 72 20 66 72 65 65 20 70 61 67 65   Other free page
1fb40 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  s already exist.
1fb50 20 20 52 65 74 72 69 76 65 20 74 68 65 20 66 69    Retrive the fi
1fb60 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  rst trunk page. 
1fb70 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 72 65     ** of the fre
1fb80 65 6c 69 73 74 20 61 6e 64 20 66 69 6e 64 20 6f  elist and find o
1fb90 75 74 20 68 6f 77 20 6d 61 6e 79 20 6c 65 61 76  ut how many leav
1fba0 65 73 20 69 74 20 68 61 73 2e 20 2a 2f 0a 20 20  es it has. */.  
1fbb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
1fbc0 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  k;.    rc = sqli
1fbd0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
1fbe0 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70  pBt, get4byte(&p
1fbf0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1fc00 29 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  ), &pTrunk, 0);.
1fc10 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1fc20 75 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20  urn rc;.    k = 
1fc30 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
1fc40 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
1fc50 20 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61   if( k>=pBt->usa
1fc60 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
1fc70 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72  .      /* The tr
1fc80 75 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20 54 75  unk is full.  Tu
1fc90 72 6e 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  rn the page bein
1fca0 67 20 66 72 65 65 64 20 69 6e 74 6f 20 61 20 6e  g freed into a n
1fcb0 65 77 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  ew.      ** trun
1fcc0 6b 20 70 61 67 65 20 77 69 74 68 20 6e 6f 20 6c  k page with no l
1fcd0 65 61 76 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  eaves. */.      
1fce0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fcf0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
1fd00 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
1fd10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fd20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
1fd30 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1fd40 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b  , pTrunk->pgno);
1fd50 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1fd60 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1fd70 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  4], 0);.        
1fd80 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1fd90 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61  ->aData[32], pPa
1fda0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
1fdb0 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
1fdc0 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75  PAGE: %d new tru
1fdd0 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e  nk page replacin
1fde0 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  g %d\n",.       
1fdf0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
1fe00 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  pgno, pTrunk->pg
1fe10 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no));.      }.  
1fe20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3c 30 20    }else if( k<0 
1fe30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1fe40 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
1fe50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
1fe60 2a 20 41 64 64 20 74 68 65 20 6e 65 77 6c 79 20  * Add the newly 
1fe70 66 72 65 65 64 20 70 61 67 65 20 61 73 20 61 20  freed page as a 
1fe80 6c 65 61 66 20 6f 6e 20 74 68 65 20 63 75 72 72  leaf on the curr
1fe90 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  ent trunk */.   
1fea0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1feb0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
1fec0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1fed0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fee0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1fef0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
1ff00 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b  >aData[4], k+1);
1ff10 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1ff20 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
1ff30 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e  [8+k*4], pPage->
1ff40 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53  pgno);.#ifndef S
1ff50 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
1ff60 45 54 45 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ETE.        sqli
1ff70 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
1ff80 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1ff90 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1ffa0 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
1ffb0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
1ffc0 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
1ffd0 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
1ffe0 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
1fff0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
20000 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
20010 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
20020 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  c;.}../*.** Free
20030 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
20040 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
20050 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
20060 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
20070 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
20080 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
20090 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
200a0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
200b0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
200c0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
200d0 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
200e0 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
200f0 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 69 6e 74 20  nt nOvfl;.  int 
20100 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
20110 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20120 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
20130 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
20140 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
20150 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
20160 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
20170 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
20180 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20  verflow==0 ){.  
20190 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
201a0 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66  OK;  /* No overf
201b0 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72  low pages. Retur
201c0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
201d0 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
201e0 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
201f0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
20200 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
20210 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
20220 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
20230 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
20240 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
20250 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
20260 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
20270 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
20280 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f  assert( ovflPgno
20290 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29  ==0 || nOvfl>0 )
202a0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
202b0 2d 2d 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  -- ){.    MemPag
202c0 65 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66  e *pOvfl;.    if
202d0 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
202e0 20 6f 76 66 6c 50 67 6e 6f 3e 73 71 6c 69 74 65   ovflPgno>sqlite
202f0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
20300 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
20310 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
20320 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20330 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
20340 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
20350 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
20360 20 26 70 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d   &pOvfl, (nOvfl=
20370 3d 30 29 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29  =0)?0:&ovflPgno)
20380 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
20390 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
203a0 20 3d 20 66 72 65 65 50 61 67 65 28 70 4f 76 66   = freePage(pOvf
203b0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  l);.    sqlite3P
203c0 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
203d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
203e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
203f0 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  c;.  }.  return 
20400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
20410 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62  .** Create the b
20420 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65  yte sequence use
20430 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
20440 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50   cell on page pP
20450 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  age.** and write
20460 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65   that byte seque
20470 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d  nce into pCell[]
20480 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  .  Overflow page
20490 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
204a0 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e  ed and filled in
204b0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20   as necessary.  
204c0 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  The calling proc
204d0 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70  edure.** is resp
204e0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69  onsible for maki
204f0 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65  ng sure sufficie
20500 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65  nt space has bee
20510 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66  n allocated.** f
20520 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a  or pCell[]..**.*
20530 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c  * Note that pCel
20540 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73  l does not neces
20550 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69  sary need to poi
20560 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d  nt to the pPage-
20570 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20  >aData.** area. 
20580 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69   pCell might poi
20590 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f  nt to some tempo
205a0 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54  rary storage.  T
205b0 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20  he cell will.** 
205c0 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69  be constructed i
205d0 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79  n this temporary
205e0 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65   area then copie
205f0 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  d into pPage->aD
20600 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f  ata.** later..*/
20610 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
20620 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  InCell(.  MemPag
20630 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
20640 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20650 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
20660 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ns the cell */. 
20670 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
20680 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
20690 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74  /* Complete text
206a0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
206b0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
206c0 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  ey, i64 nKey,   
206d0 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20   /* The key */. 
206e0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
206f0 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  ta,int nData,   
20700 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
20710 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20730 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79  /* Extra zero by
20740 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
20750 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20   pData */.  int 
20760 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
20770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
20780 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
20790 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
207a0 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
207b0 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
207c0 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20   nSrc, n, rc;.  
207d0 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  int spaceLeft;. 
207e0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
207f0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
20800 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a  pToRelease = 0;.
20810 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
20820 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67  *pPrior;.  unsig
20830 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f  ned char *pPaylo
20840 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ad;.  BtShared *
20850 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
20860 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66  ;.  Pgno pgnoOvf
20870 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65  l = 0;.  int nHe
20880 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f  ader;.  CellInfo
20890 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74   info;..  assert
208a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
208b0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
208c0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
208d0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
208e0 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
208f0 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50  r = 0;.  if( !pP
20900 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
20910 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20   nHeader += 4;. 
20920 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
20930 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e  hasData ){.    n
20940 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
20950 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
20960 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f  er], nData+nZero
20970 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20980 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20  nData = nZero = 
20990 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72  0;.  }.  nHeader
209a0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
209b0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
209c0 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (u64*)&nKey);.  
209d0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
209e0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
209f0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
20a00 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48   assert( info.nH
20a10 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29  eader==nHeader )
20a20 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
20a30 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
20a40 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44   assert( info.nD
20a50 61 74 61 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f  ata==nData+nZero
20a60 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c   );.  .  /* Fill
20a70 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
20a80 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  */.  nPayload = 
20a90 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20  nData + nZero;. 
20aa0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
20ab0 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d  ey ){.    pSrc =
20ac0 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63   pData;.    nSrc
20ad0 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44   = nData;.    nD
20ae0 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ata = 0;.  }else
20af0 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  {.    nPayload +
20b00 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63  = nKey;.    pSrc
20b10 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72   = pKey;.    nSr
20b20 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  c = nKey;.  }.  
20b30 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e  *pnSize = info.n
20b40 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66  Size;.  spaceLef
20b50 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  t = info.nLocal;
20b60 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
20b70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20  Cell[nHeader];. 
20b80 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
20b90 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
20ba0 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79  ;..  while( nPay
20bb0 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66  load>0 ){.    if
20bc0 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
20bd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 45 78  {.      int isEx
20be0 61 63 74 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  act = 0;.#ifndef
20bf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
20c00 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67  OVACUUM.      Pg
20c10 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20  no pgnoPtrmap = 
20c20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65  pgnoOvfl; /* Ove
20c30 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
20c40 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67  er-map entry pag
20c50 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  e */.      if( p
20c60 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
20c70 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
20c80 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c          pgnoOvfl
20c90 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68  ++;.        } wh
20ca0 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20  ile( .          
20cb0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
20cc0 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20  t, pgnoOvfl) || 
20cd0 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e  pgnoOvfl==PENDIN
20ce0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
20cf0 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20   .        );.   
20d00 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4f 76 66       if( pgnoOvf
20d10 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l>1 ){.         
20d20 20 2f 2a 20 69 73 45 78 61 63 74 20 3d 20 31 3b   /* isExact = 1;
20d30 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
20d40 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
20d50 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
20d60 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
20d70 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
20d80 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 69 73 45 78  , pgnoOvfl, isEx
20d90 61 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  act);.#ifndef SQ
20da0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
20db0 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
20dc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
20dd0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
20de0 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f  um, and the seco
20df0 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74  nd or subsequent
20e00 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
20e10 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  ow page is being
20e20 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20   allocated, add 
20e30 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
20e40 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
20e50 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61    ** for that pa
20e60 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a  ge now. .      *
20e70 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68  *.      ** If th
20e80 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
20e90 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
20ea0 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74  hen write a part
20eb0 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20  ial entry .     
20ec0 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74   ** to the point
20ed0 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72  er-map. If we wr
20ee0 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  ite nothing to t
20ef0 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  his pointer-map 
20f00 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74  slot,.      ** t
20f10 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74  hen the optimist
20f20 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ic overflow chai
20f30 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20  n processing in 
20f40 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20  clearCell().    
20f50 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65    ** may misinte
20f60 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74  rpret the uninit
20f70 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61  ialised values a
20f80 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20  nd delete the.  
20f90 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67      ** wrong pag
20fa0 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  es from the data
20fb0 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  base..      */. 
20fc0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
20fd0 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d  toVacuum && rc==
20fe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20ff0 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20       u8 eType = 
21000 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d  (pgnoPtrmap?PTRM
21010 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52  AP_OVERFLOW2:PTR
21020 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a  MAP_OVERFLOW1);.
21030 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
21040 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
21050 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
21060 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20  oPtrmap);.      
21070 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
21080 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
21090 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  e(pOvfl);.      
210a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
210b0 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  if.      if( rc 
210c0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
210d0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
210e0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
210f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
21100 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
21110 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b  rior, pgnoOvfl);
21120 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
21130 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
21140 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65        pToRelease
21150 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20   = pOvfl;.      
21160 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e  pPrior = pOvfl->
21170 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74  aData;.      put
21180 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29  4byte(pPrior, 0)
21190 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64  ;.      pPayload
211a0 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61   = &pOvfl->aData
211b0 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65  [4];.      space
211c0 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62  Left = pBt->usab
211d0 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20  leSize - 4;.    
211e0 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f  }.    n = nPaylo
211f0 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70  ad;.    if( n>sp
21200 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70  aceLeft ) n = sp
21210 61 63 65 4c 65 66 74 3b 0a 20 20 20 20 69 66 28  aceLeft;.    if(
21220 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
21230 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
21240 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
21250 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
21260 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
21270 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
21280 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21290 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
212a0 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
212b0 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
212c0 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
212d0 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
212e0 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
212f0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
21300 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
21310 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
21320 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
21330 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
21340 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
21350 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
21360 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
21370 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
21380 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4d 65  ** Change the Me
21390 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20 70 6f  mPage.pParent po
213a0 69 6e 74 65 72 20 6f 6e 20 74 68 65 20 70 61 67  inter on the pag
213b0 65 20 77 68 6f 73 65 20 6e 75 6d 62 65 72 20 69  e whose number i
213c0 73 0a 2a 2a 20 67 69 76 65 6e 20 69 6e 20 74 68  s.** given in th
213d0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
213e0 74 20 73 6f 20 74 68 61 74 20 4d 65 6d 50 61 67  t so that MemPag
213f0 65 2e 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20  e.pParent holds 
21400 74 68 65 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69  the.** pointer i
21410 6e 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  n the third argu
21420 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
21430 69 6e 74 20 72 65 70 61 72 65 6e 74 50 61 67 65  int reparentPage
21440 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
21450 50 67 6e 6f 20 70 67 6e 6f 2c 20 4d 65 6d 50 61  Pgno pgno, MemPa
21460 67 65 20 2a 70 4e 65 77 50 61 72 65 6e 74 2c 20  ge *pNewParent, 
21470 69 6e 74 20 69 64 78 29 7b 0a 20 20 4d 65 6d 50  int idx){.  MemP
21480 61 67 65 20 2a 70 54 68 69 73 3b 0a 20 20 44 62  age *pThis;.  Db
21490 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
214a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
214b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
214c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
214d0 73 65 72 74 28 20 70 4e 65 77 50 61 72 65 6e 74  sert( pNewParent
214e0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 67 6e  !=0 );.  if( pgn
214f0 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  o==0 ) return SQ
21500 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
21510 74 28 20 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  t( pBt->pPager!=
21520 30 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  0 );.  pDbPage =
21530 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
21540 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
21550 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
21560 62 50 61 67 65 20 29 7b 0a 20 20 20 20 70 54 68  bPage ){.    pTh
21570 69 73 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  is = (MemPage *)
21580 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
21590 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
215a0 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 69 73     if( pThis->is
215b0 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Init ){.      as
215c0 73 65 72 74 28 20 70 54 68 69 73 2d 3e 61 44 61  sert( pThis->aDa
215d0 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ta==sqlite3Pager
215e0 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
215f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
21600 68 69 73 2d 3e 70 50 61 72 65 6e 74 21 3d 70 4e  his->pParent!=pN
21610 65 77 50 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  ewParent ){.    
21620 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70      if( pThis->p
21630 50 61 72 65 6e 74 20 29 20 73 71 6c 69 74 65 33  Parent ) sqlite3
21640 50 61 67 65 72 55 6e 72 65 66 28 70 54 68 69 73  PagerUnref(pThis
21650 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  ->pParent->pDbPa
21660 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 54 68  ge);.        pTh
21670 69 73 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 4e  is->pParent = pN
21680 65 77 50 61 72 65 6e 74 3b 0a 20 20 20 20 20 20  ewParent;.      
21690 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
216a0 66 28 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 44  f(pNewParent->pD
216b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  bPage);.      }.
216c0 20 20 20 20 20 20 70 54 68 69 73 2d 3e 69 64 78        pThis->idx
216d0 50 61 72 65 6e 74 20 3d 20 69 64 78 3b 0a 20 20  Parent = idx;.  
216e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
216f0 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
21700 65 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  e);.  }..#ifndef
21710 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
21720 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42  OVACUUM.  if( pB
21730 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
21740 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d  .    return ptrm
21750 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 2c  apPut(pBt, pgno,
21760 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
21770 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29  NewParent->pgno)
21780 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
21790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
217a0 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  .}..../*.** Chan
217b0 67 65 20 74 68 65 20 70 50 61 72 65 6e 74 20 70  ge the pParent p
217c0 6f 69 6e 74 65 72 20 6f 66 20 61 6c 6c 20 63 68  ointer of all ch
217d0 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 67 65 20  ildren of pPage 
217e0 74 6f 20 70 6f 69 6e 74 20 62 61 63 6b 0a 2a 2a  to point back.**
217f0 20 74 6f 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   to pPage..**.**
21800 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
21810 20 66 6f 72 20 65 76 65 72 79 20 63 68 69 6c 64   for every child
21820 20 6f 66 20 70 50 61 67 65 2c 20 69 6e 76 6f 6b   of pPage, invok
21830 65 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 29  e reparentPage()
21840 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  .** to make sure
21850 20 74 68 61 74 20 65 61 63 68 20 63 68 69 6c 64   that each child
21860 20 6b 6e 6f 77 73 20 74 68 61 74 20 70 50 61 67   knows that pPag
21870 65 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e  e is its parent.
21880 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
21890 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
218a0 61 66 74 65 72 20 79 6f 75 20 6d 65 6d 63 70 79  after you memcpy
218b0 28 29 20 6f 6e 65 20 70 61 67 65 20 69 6e 74 6f  () one page into
218c0 0a 2a 2a 20 61 6e 6f 74 68 65 72 2e 0a 2a 2f 0a  .** another..*/.
218d0 73 74 61 74 69 63 20 69 6e 74 20 72 65 70 61 72  static int repar
218e0 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28 4d 65  entChildPages(Me
218f0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
21900 20 69 6e 74 20 69 3b 0a 20 20 42 74 53 68 61 72   int i;.  BtShar
21910 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
21920 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
21930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
21940 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
21950 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
21960 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
21970 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
21980 66 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f ) return SQLIT
21990 45 5f 4f 4b 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  E_OK;..  for(i=0
219a0 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
219b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
219c0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
219d0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
219e0 72 63 20 3d 20 72 65 70 61 72 65 6e 74 50 61 67  rc = reparentPag
219f0 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
21a00 70 43 65 6c 6c 29 2c 20 70 50 61 67 65 2c 20 69  pCell), pPage, i
21a10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
21a20 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
21a30 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  n rc;.  }.  rc =
21a40 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 70 42   reparentPage(pB
21a50 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t, get4byte(&pPa
21a60 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
21a70 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 2c 20  >hdrOffset+8]), 
21a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21a90 20 20 20 20 20 70 50 61 67 65 2c 20 69 29 3b 0a       pPage, i);.
21aa0 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66    pPage->idxShif
21ab0 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
21ac0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  rc;.}../*.** Rem
21ad0 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c  ove the i-th cel
21ae0 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54  l from pPage.  T
21af0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65  his routine effe
21b00 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a  cts pPage only..
21b10 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** The cell cont
21b20 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64  ent is not freed
21b30 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e   or deallocated.
21b40 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
21b50 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c  that.** the cell
21b60 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65   content has bee
21b70 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61  n copied somepla
21b80 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72  ce else.  This r
21b90 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72  outine just.** r
21ba0 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72  emoves the refer
21bb0 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c  ence to the cell
21bc0 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a   from pPage..**.
21bd0 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20  ** "sz" must be 
21be0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
21bf0 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e  tes in the cell.
21c00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21c10 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65  dropCell(MemPage
21c20 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78   *pPage, int idx
21c30 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74  , int sz){.  int
21c40 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   i;          /* 
21c50 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
21c60 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
21c70 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
21c80 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
21c90 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
21ca0 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
21cb0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
21cc0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
21cd0 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
21ce0 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
21cf0 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
21d00 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73  data[] */..  ass
21d10 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
21d20 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
21d30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
21d40 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
21d50 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
21d60 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
21d70 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
21d80 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
21d90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21da0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
21db0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
21dc0 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
21dd0 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20  >aData;.  ptr = 
21de0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c  &data[pPage->cel
21df0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d  lOffset + 2*idx]
21e00 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  ;.  pc = get2byt
21e10 65 28 70 74 72 29 3b 0a 20 20 61 73 73 65 72 74  e(ptr);.  assert
21e20 28 20 70 63 3e 31 30 20 26 26 20 70 63 2b 73 7a  ( pc>10 && pc+sz
21e30 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
21e40 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 66 72  ableSize );.  fr
21e50 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
21e60 63 2c 20 73 7a 29 3b 0a 20 20 66 6f 72 28 69 3d  c, sz);.  for(i=
21e70 69 64 78 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e  idx+1; i<pPage->
21e80 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b  nCell; i++, ptr+
21e90 3d 32 29 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20  =2){.    ptr[0] 
21ea0 3d 20 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74  = ptr[2];.    pt
21eb0 72 5b 31 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20  r[1] = ptr[3];. 
21ec0 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c   }.  pPage->nCel
21ed0 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28  l--;.  put2byte(
21ee0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
21ef0 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65  Offset+3], pPage
21f00 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67  ->nCell);.  pPag
21f10 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20  e->nFree += 2;. 
21f20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
21f30 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   = 1;.}../*.** I
21f40 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
21f50 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c   on pPage at cel
21f60 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43  l index "i".  pC
21f70 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ell points to th
21f80 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
21f90 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  the cell..**.** 
21fa0 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
21fb0 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ent will fit on 
21fc0 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70  the page, then p
21fd0 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66  ut it there.  If
21fe0 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20   it.** will not 
21ff0 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61  fit, then make a
22000 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c   copy of the cel
22010 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70  l content into p
22020 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70  Temp if.** pTemp
22030 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52   is not null.  R
22040 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65  egardless of pTe
22050 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  mp, allocate a n
22060 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70  ew entry.** in p
22070 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e  Page->aOvfl[] an
22080 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20  d make it point 
22090 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
220a0 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69  ent (either.** i
220b0 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f  n pTemp or the o
220c0 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61  riginal pCell) a
220d0 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69  nd also record i
220e0 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c  ts index. .** Al
220f0 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65  locating a new e
22100 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61  ntry in pPage->a
22110 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74  Cell[] implies t
22120 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e  hat .** pPage->n
22130 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72  Overflow is incr
22140 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  emented..**.** I
22150 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  f nSkip is non-z
22160 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ero, then do not
22170 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20   copy the first 
22180 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74  nSkip bytes of t
22190 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  he.** cell. The 
221a0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72  caller will over
221b0 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72  write them after
221c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
221d0 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53  eturns. If.** nS
221e0 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
221f0 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20   then pCell may 
22200 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  not point to an 
22210 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c  invalid memory l
22220 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74  ocation .** (but
22230 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20   pCell+nSkip is 
22240 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a  always valid)..*
22250 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 73  /.static int ins
22260 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  ertCell(.  MemPa
22270 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
22280 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20  Page into which 
22290 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a  we are copying *
222a0 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
222b0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c        /* New cel
222c0 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d  l becomes the i-
222d0 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70  th cell of the p
222e0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  age */.  u8 *pCe
222f0 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ll,        /* Co
22300 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
22310 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73   cell */.  int s
22320 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z,           /* 
22330 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  Bytes of content
22340 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   in pCell */.  u
22350 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20  8 *pTemp,       
22360 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
22370 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c   space for pCell
22380 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  , if needed */. 
22390 20 75 38 20 6e 53 6b 69 70 20 20 20 20 20 20 20   u8 nSkip       
223a0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77 72 69     /* Do not wri
223b0 74 65 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b  te the first nSk
223c0 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ip bytes of the 
223d0 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  cell */.){.  int
223e0 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f   idx;          /
223f0 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
22400 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   new cell conten
22410 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  t in data[] */. 
22420 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
22430 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
22440 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b  er */.  int top;
22450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
22460 73 74 20 62 79 74 65 20 6f 66 20 63 6f 6e 74 65  st byte of conte
22470 6e 74 20 66 6f 72 20 61 6e 79 20 63 65 6c 6c 20  nt for any cell 
22480 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
22490 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20  nt end;         
224a0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
224b0 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ast the last cel
224c0 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
224d0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73  a[] */.  int ins
224e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
224f0 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68  dex in data[] wh
22500 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  ere new cell poi
22510 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64  nter is inserted
22520 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
22530 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
22540 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20 6f 66  t into data[] of
22550 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
22560 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
22570 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65  fset;   /* Addre
22580 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ss of first cell
22590 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
225a0 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  [] */.  u8 *data
225b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
225c0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
225d0 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20  whole page */.  
225e0 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
225f0 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f    /* Used for mo
22600 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ving information
22610 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b   around in data[
22620 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ] */..  assert( 
22630 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65  i>=0 && i<=pPage
22640 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e  ->nCell+pPage->n
22650 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73  Overflow );.  as
22660 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
22670 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
22680 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ll) );.  assert(
22690 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
226a0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
226b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
226c0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
226d0 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
226e0 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
226f0 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
22700 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b  memcpy(pTemp+nSk
22710 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  ip, pCell+nSkip,
22720 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
22730 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
22740 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
22750 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
22760 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
22770 3c 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  <sizeof(pPage->a
22780 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
22790 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20 29 3b  ge->aOvfl[0]) );
227a0 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66  .    pPage->aOvf
227b0 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43 65  l[j].pCell = pCe
227c0 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ll;.    pPage->a
227d0 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b  Ovfl[j].idx = i;
227e0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
227f0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
22800 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
22810 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
22820 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
22830 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
22850 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
22860 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
22870 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
22880 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
22890 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
228a0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
228b0 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
228c0 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
228d0 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
228e0 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
228f0 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
22900 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
22910 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c  ;.    end = cell
22920 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
22930 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20 20 20  ->nCell + 2;.   
22940 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65   ins = cellOffse
22950 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69 66 28  t + 2*i;.    if(
22960 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73 7a 20   end > top - sz 
22970 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 64 65  ){.      rc = de
22980 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
22990 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
229a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
229b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
229c0 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
229d0 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
229e0 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20      assert( end 
229f0 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20  + sz <= top );. 
22a00 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61     }.    idx = a
22a10 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
22a20 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73  ge, sz);.    ass
22a30 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20  ert( idx>0 );.  
22a40 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d    assert( end <=
22a50 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
22a60 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70  hdr+5]) );.    p
22a70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
22a80 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
22a90 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79  -= 2;.    memcpy
22aa0 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
22ab0 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
22ac0 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66  sz-nSkip);.    f
22ad0 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d  or(j=end-2, ptr=
22ae0 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b  &data[j]; j>ins;
22af0 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a   j-=2, ptr-=2){.
22b00 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70        ptr[0] = p
22b10 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74  tr[-2];.      pt
22b20 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a  r[1] = ptr[-1];.
22b30 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79      }.    put2by
22b40 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69  te(&data[ins], i
22b50 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  dx);.    put2byt
22b60 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
22b70 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
22b80 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69     pPage->idxShi
22b90 66 74 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  ft = 1;.#ifndef 
22ba0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
22bb0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
22bc0 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  Page->pBt->autoV
22bd0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f  acuum ){.      /
22be0 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63  * The cell may c
22bf0 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  ontain a pointer
22c00 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
22c10 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69  page. If so, wri
22c20 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
22c30 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76  entry for the ov
22c40 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f  erflow page into
22c50 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
22c60 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
22c70 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
22c80 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
22c90 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
22ca0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
22cb0 66 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fo);.      asser
22cc0 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28  t( (info.nData+(
22cd0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a  pPage->intKey?0:
22ce0 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66  info.nKey))==inf
22cf0 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  o.nPayload );.  
22d00 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44      if( (info.nD
22d10 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
22d20 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
22d30 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
22d40 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e          Pgno pgn
22d50 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  oOvfl = get4byte
22d60 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
22d70 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20  erflow]);.      
22d80 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
22d90 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e  (pPage->pBt, pgn
22da0 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  oOvfl, PTRMAP_OV
22db0 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
22dc0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
22dd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22de0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
22df0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
22e00 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  if.  }..  return
22e10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
22e20 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20  *.** Add a list 
22e30 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61  of cells to a pa
22e40 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73 68  ge.  The page sh
22e50 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c  ould be initiall
22e60 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20  y empty..** The 
22e70 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e  cells are guaran
22e80 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74  teed to fit on t
22e90 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
22ea0 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65  ic void assemble
22eb0 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
22ec0 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65  *pPage,   /* The
22ed0 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73 65   page to be asse
22ee0 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20  mblied */.  int 
22ef0 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  nCell,        /*
22f00 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
22f10 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74  ells to add to t
22f20 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  his page */.  u8
22f30 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20   **apCell,      
22f40 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63  /* Pointers to c
22f50 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20  ell bodies */.  
22f60 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20  u16 *aSize      
22f70 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68    /* Sizes of th
22f80 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20  e cells */.){.  
22f90 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
22fa0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
22fb0 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61 6c  r */.  int total
22fc0 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74 61  Size;    /* Tota
22fd0 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
22fe0 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  lls */.  int hdr
22ff0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
23000 64 65 78 20 6f 66 20 70 61 67 65 20 68 65 61 64  dex of page head
23010 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
23020 70 74 72 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ptr;      /* Add
23030 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
23040 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69  l pointer */.  i
23050 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20  nt cellbody;    
23060 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
23070 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f  ext cell body */
23080 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
23090 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
230a0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20   the page */..  
230b0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
230c0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
230d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
230e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
230f0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
23100 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d 20  ;.  totalSize = 
23110 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
23120 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
23130 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d 20 61 53   totalSize += aS
23140 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61 73  ize[i];.  }.  as
23150 73 65 72 74 28 20 74 6f 74 61 6c 53 69 7a 65 2b  sert( totalSize+
23160 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  2*nCell<=pPage->
23170 6e 46 72 65 65 20 29 3b 0a 20 20 61 73 73 65 72  nFree );.  asser
23180 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
23190 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72 20  =0 );.  cellptr 
231a0 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
231b0 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  set;.  data = pP
231c0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
231d0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
231e0 66 73 65 74 3b 0a 20 20 70 75 74 32 62 79 74 65  fset;.  put2byte
231f0 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e  (&data[hdr+3], n
23200 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43 65  Cell);.  if( nCe
23210 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62 6f  ll ){.    cellbo
23220 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  dy = allocateSpa
23230 63 65 28 70 50 61 67 65 2c 20 74 6f 74 61 6c 53  ce(pPage, totalS
23240 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ize);.    assert
23250 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a  ( cellbody>0 );.
23260 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
23270 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e 43  e->nFree >= 2*nC
23280 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ell );.    pPage
23290 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43 65  ->nFree -= 2*nCe
232a0 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ll;.    for(i=0;
232b0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
232c0 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
232d0 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20 63  data[cellptr], c
232e0 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20 20  ellbody);.      
232f0 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c  memcpy(&data[cel
23300 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69  lbody], apCell[i
23310 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20  ], aSize[i]);.  
23320 20 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20 32      cellptr += 2
23330 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62 6f 64 79  ;.      cellbody
23340 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20   += aSize[i];.  
23350 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
23360 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65 2d  cellbody==pPage-
23370 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
23380 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d   );.  }.  pPage-
23390 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a  >nCell = nCell;.
233a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
233b0 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72  lowing parameter
233c0 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20  s determine how 
233d0 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61  many adjacent pa
233e0 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64  ges get involved
233f0 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69  .** in a balanci
23400 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
23410 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
23420 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
23430 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f  either side.** o
23440 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
23450 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
23460 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65  he balancing ope
23470 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74  ration.  NB is t
23480 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62  he.** total numb
23490 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
234a0 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e   participate, in
234b0 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67  cluding the targ
234c0 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e  et page and.** N
234d0 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  N neighbors on e
234e0 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a  ither side..**.*
234f0 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61  * The minimum va
23500 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28  lue of NN is 1 (
23510 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63  of course).  Inc
23520 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65  reasing NN above
23530 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33   1.** (to 2 or 3
23540 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74  ) gives a modest
23550 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20   improvement in 
23560 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54  SELECT and DELET
23570 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  E performance.**
23580 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72   in exchange for
23590 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64   a larger degrad
235a0 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20  ation in INSERT 
235b0 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f  and UPDATE perfo
235c0 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76  rmance..** The v
235d0 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61  alue of NN appea
235e0 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62  rs to give the b
235f0 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72  est results over
23600 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  all..*/.#define 
23610 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20  NN 1            
23620 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
23630 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
23640 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20  r side of pPage 
23650 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e  */.#define NB (N
23660 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54  N*2+1)      /* T
23670 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c  otal pages invol
23680 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ved in the balan
23690 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72  ce */../* Forwar
236a0 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
236b0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
236c0 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69 6e 74 29  e(MemPage*, int)
236d0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
236e0 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
236f0 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  NCE./*.** This v
23700 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63  ersion of balanc
23710 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20  e() handles the 
23720 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63  common special c
23730 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e  ase where.** a n
23740 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e  ew entry is bein
23750 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68  g inserted on th
23760 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d  e extreme right-
23770 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72  end of the.** tr
23780 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  ee, in other wor
23790 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77  ds, when the new
237a0 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f   entry will beco
237b0 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a  me the largest.*
237c0 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
237d0 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65  ree..**.** Inste
237e0 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c  ad of trying bal
237f0 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
23800 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
23810 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
23820 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
23830 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
23840 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
23850 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
23860 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
23870 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
23880 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
23890 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
238a0 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
238b0 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
238c0 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
238d0 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
238e0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
238f0 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
23900 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
23910 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
23920 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
23930 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
23940 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
23950 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
23960 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
23970 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
23980 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
23990 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
239a0 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
239b0 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
239c0 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
239d0 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
239e0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
239f0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
23a00 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
23a10 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  uick(MemPage *pP
23a20 61 67 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50  age, MemPage *pP
23a30 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  arent){.  int rc
23a40 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  ;.  MemPage *pNe
23a50 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  w;.  Pgno pgnoNe
23a60 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a  w;.  u8 *pCell;.
23a70 20 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a 20 20    u16 szCell;.  
23a80 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
23a90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
23aa0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
23ab0 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20 70  nt parentIdx = p
23ac0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20  Parent->nCell;  
23ad0 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77 20   /* pParent new 
23ae0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 64  divider cell ind
23af0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65  ex */.  int pare
23b00 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ntSize;         
23b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
23b20 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65 72  e of new divider
23b30 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61   cell */.  u8 pa
23b40 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20  rentCell[64];   
23b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23b60 53 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  Space for the ne
23b70 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  w divider cell *
23b80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
23b90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
23ba0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
23bb0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  x) );..  /* Allo
23bc0 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e  cate a new page.
23bd0 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72   Insert the over
23be0 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70  flow cell from p
23bf0 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69  Page.  ** into i
23c00 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74  t. Then remove t
23c10 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
23c20 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a   from pPage..  *
23c30 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  /.  rc = allocat
23c40 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
23c50 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c  &pNew, &pgnoNew,
23c60 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
23c70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23c80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
23c90 7d 0a 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67  }.  pCell = pPag
23ca0 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c  e->aOvfl[0].pCel
23cb0 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65  l;.  szCell = ce
23cc0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
23cd0 20 70 43 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50   pCell);.  zeroP
23ce0 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67 65 2d  age(pNew, pPage-
23cf0 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 61 73  >aData[0]);.  as
23d00 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
23d10 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43   1, &pCell, &szC
23d20 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
23d30 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20  Overflow = 0;.. 
23d40 20 2f 2a 20 53 65 74 20 74 68 65 20 70 61 72 65   /* Set the pare
23d50 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 6c 79 20  nt of the newly 
23d60 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 74  allocated page t
23d70 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  o pParent. */.  
23d80 70 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20  pNew->pParent = 
23d90 70 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74  pParent;.  sqlit
23da0 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65  e3PagerRef(pPare
23db0 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20  nt->pDbPage);.. 
23dc0 20 2f 2a 20 70 50 61 67 65 20 69 73 20 63 75 72   /* pPage is cur
23dd0 72 65 6e 74 6c 79 20 74 68 65 20 72 69 67 68 74  rently the right
23de0 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e  -child of pParen
23df0 74 2e 20 43 68 61 6e 67 65 20 74 68 69 73 0a 20  t. Change this. 
23e00 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20   ** so that the 
23e10 72 69 67 68 74 2d 63 68 69 6c 64 20 69 73 20 74  right-child is t
23e20 68 65 20 6e 65 77 20 70 61 67 65 20 61 6c 6c 6f  he new page allo
23e30 63 61 74 65 64 20 61 62 6f 76 65 20 61 6e 64 0a  cated above and.
23e40 20 20 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68    ** pPage is th
23e50 65 20 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74 20  e next-to-right 
23e60 63 68 69 6c 64 2e 20 0a 20 20 2a 2f 0a 20 20 61  child. .  */.  a
23e70 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
23e80 65 6c 6c 3e 30 20 29 3b 0a 20 20 70 43 65 6c 6c  ell>0 );.  pCell
23e90 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
23ea0 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  e, pPage->nCell-
23eb0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  1);.  sqlite3Btr
23ec0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
23ed0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
23ee0 66 6f 29 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c  fo);.  rc = fill
23ef0 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  InCell(pParent, 
23f00 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69  parentCell, 0, i
23f10 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20  nfo.nKey, 0, 0, 
23f20 30 2c 20 26 70 61 72 65 6e 74 53 69 7a 65 29 3b  0, &parentSize);
23f30 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
23f40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
23f50 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
23f60 65 72 74 28 20 70 61 72 65 6e 74 53 69 7a 65 3c  ert( parentSize<
23f70 36 34 20 29 3b 0a 20 20 72 63 20 3d 20 69 6e 73  64 );.  rc = ins
23f80 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ertCell(pParent,
23f90 20 70 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65   parentIdx, pare
23fa0 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69  ntCell, parentSi
23fb0 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20 69 66 28  ze, 0, 4);.  if(
23fc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23fd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
23fe0 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28  .  }.  put4byte(
23ff0 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
24000 28 70 50 61 72 65 6e 74 2c 70 61 72 65 6e 74 49  (pParent,parentI
24010 64 78 29 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  dx), pPage->pgno
24020 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
24030 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
24040 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
24050 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a  +8], pgnoNew);..
24060 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24070 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
24080 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
24090 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
240a0 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
240b0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
240c0 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73   ** with entries
240d0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67   for the new pag
240e0 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74  e, and any point
240f0 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a  er from the .  *
24100 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61  * cell on the pa
24110 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ge to an overflo
24120 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
24130 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
24140 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  um ){.    rc = p
24150 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
24160 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54  noNew, PTRMAP_BT
24170 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
24180 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  no);.    if( rc=
24190 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
241a0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
241b0 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20 30 29 3b  utOvfl(pNew, 0);
241c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
241d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
241e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
241f0 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 72  e(pNew);.      r
24200 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
24210 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
24220 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   Release the ref
24230 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  erence to the ne
24240 77 20 70 61 67 65 20 61 6e 64 20 62 61 6c 61 6e  w page and balan
24250 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ce the parent pa
24260 67 65 2c 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65  ge,.  ** in case
24270 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
24280 6c 20 69 6e 73 65 72 74 65 64 20 63 61 75 73 65  l inserted cause
24290 64 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f  d it to become o
242a0 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  verfull..  */.  
242b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
242c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 61 6c 61  );.  return bala
242d0 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b  nce(pParent, 0);
242e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
242f0 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
24300 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  LANCE */../*.** 
24310 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
24320 69 73 74 72 69 62 75 74 65 73 20 43 65 6c 6c 73  istributes Cells
24330 20 6f 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70   on pPage and up
24340 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c 69 6e 67   to NN*2 sibling
24350 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65 20 73 6f  s.** of pPage so
24360 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
24370 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 20 73  have about the s
24380 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  ame amount of fr
24390 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20 55 73 75  ee space..** Usu
243a0 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69 6e 67 73  ally NN siblings
243b0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
243c0 6f 66 20 70 50 61 67 65 20 69 73 20 75 73 65 64  of pPage is used
243d0 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
243e0 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 6d 6f 72  g,.** though mor
243f0 65 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74  e siblings might
24400 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 20 73   come from one s
24410 69 64 65 20 69 66 20 70 50 61 67 65 20 69 73 20  ide if pPage is 
24420 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 6f 72 20  the first.** or 
24430 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74  last child of it
24440 73 20 70 61 72 65 6e 74 2e 20 20 49 66 20 70 50  s parent.  If pP
24450 61 67 65 20 68 61 73 20 66 65 77 65 72 20 74 68  age has fewer th
24460 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69 6e 67 73  an 2*NN siblings
24470 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e 67 20 77  .** (something w
24480 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61  hich can only ha
24490 70 70 65 6e 20 69 66 20 70 50 61 67 65 20 69 73  ppen if pPage is
244a0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
244b0 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64 20 6f 66  r a .** child of
244c0 20 72 6f 6f 74 29 20 74 68 65 6e 20 61 6c 6c 20   root) then all 
244d0 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e  available siblin
244e0 67 73 20 70 61 72 74 69 63 69 70 61 74 65 20 69  gs participate i
244f0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e  n the balancing.
24500 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  .**.** The numbe
24510 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66  r of siblings of
24520 20 70 50 61 67 65 20 6d 69 67 68 74 20 62 65 20   pPage might be 
24530 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63  increased or dec
24540 72 65 61 73 65 64 20 62 79 20 6f 6e 65 20 6f 72  reased by one or
24550 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e 20 65 66  .** two in an ef
24560 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67  fort to keep pag
24570 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62  es nearly full b
24580 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c  ut not over full
24590 2e 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 0a  . The root page.
245a0 2a 2a 20 69 73 20 73 70 65 63 69 61 6c 20 61 6e  ** is special an
245b0 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  d is allowed to 
245c0 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e  be nearly empty.
245d0 20 49 66 20 70 50 61 67 65 20 69 73 20 0a 2a 2a   If pPage is .**
245e0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20   the root page, 
245f0 74 68 65 6e 20 74 68 65 20 64 65 70 74 68 20 6f  then the depth o
24600 66 20 74 68 65 20 74 72 65 65 20 6d 69 67 68 74  f the tree might
24610 20 62 65 20 69 6e 63 72 65 61 73 65 64 0a 2a 2a   be increased.**
24620 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79   or decreased by
24630 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65 73 73 61   one, as necessa
24640 72 79 2c 20 74 6f 20 6b 65 65 70 20 74 68 65 20  ry, to keep the 
24650 72 6f 6f 74 20 70 61 67 65 20 66 72 6f 6d 20 62  root page from b
24660 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c  eing.** overfull
24670 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   or completely e
24680 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  mpty..**.** Note
24690 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20   that when this 
246a0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
246b0 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 43  d, some of the C
246c0 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 0a 2a 2a  ells on pPage.**
246d0 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61   might not actua
246e0 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e  lly be stored in
246f0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e   pPage->aData[].
24700 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65    This can happe
24710 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65  n.** if the page
24720 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 20 50   is overfull.  P
24730 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 62 20 6f  art of the job o
24740 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
24750 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 73 75 72  s to.** make sur
24760 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66 6f 72 20  e all Cells for 
24770 70 50 61 67 65 20 6f 6e 63 65 20 61 67 61 69 6e  pPage once again
24780 20 66 69 74 20 69 6e 20 70 50 61 67 65 2d 3e 61   fit in pPage->a
24790 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e  Data[]..**.** In
247a0 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62   the course of b
247b0 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 73 69 62  alancing the sib
247c0 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 2c 20  lings of pPage, 
247d0 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50  the parent of pP
247e0 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 62 65 63  age.** might bec
247f0 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  ome overfull or 
24800 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49 66 20 74  underfull.  If t
24810 68 61 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65  hat happens, the
24820 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
24830 2a 20 69 73 20 63 61 6c 6c 65 64 20 72 65 63 75  * is called recu
24840 72 73 69 76 65 6c 79 20 6f 6e 20 74 68 65 20 70  rsively on the p
24850 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  arent..**.** If 
24860 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
24870 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
24880 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76  n, it might leav
24890 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  e the database.*
248a0 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64  * in a corrupted
248b0 20 73 74 61 74 65 2e 20 20 53 6f 20 69 66 20 74   state.  So if t
248c0 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
248d0 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
248e0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
248f0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  led back..*/.sta
24900 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
24910 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61 67 65 20  nonroot(MemPage 
24920 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61  *pPage){.  MemPa
24930 67 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  ge *pParent;    
24940 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
24950 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 20 2a  arent of pPage *
24960 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
24970 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
24980 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61   /* The whole da
24990 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
249a0 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  nCell = 0;      
249b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
249c0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
249d0 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pCell[] */.  int
249e0 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20   nMaxCells = 0; 
249f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
24a00 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
24a10 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61  pCell, szCell, a
24a20 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  From. */.  int n
24a30 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
24a40 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24a50 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
24a60 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  Old[] */.  int n
24a70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
24a80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24a90 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
24aa0 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  New[] */.  int n
24ab0 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Div;            
24ac0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24ad0 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
24ae0 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  Div[] */.  int i
24af0 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
24b00 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
24b10 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
24b20 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
24b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
24b40 64 65 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20  dex of pPage in 
24b50 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
24b60 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b   */.  int nxDiv;
24b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b80 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64     /* Next divid
24b90 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65  er slot in pPare
24ba0 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
24bb0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
24bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24bd0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
24be0 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f   */.  int leafCo
24bf0 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrection;       
24c00 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65     /* 4 if pPage
24c10 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
24c20 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  f not */.  int l
24c30 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20  eafData;        
24c40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
24c50 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
24c60 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41  af of a LEAFDATA
24c70 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75   tree */.  int u
24c80 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20  sableSpace;     
24c90 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
24ca0 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64   in pPage beyond
24cb0 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
24cc0 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20   int pageFlags; 
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24ce0 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d   Value of pPage-
24cf0 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69  >aData[0] */.  i
24d00 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20  nt subtotal;    
24d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
24d20 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73  ubtotal of bytes
24d30 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65   in cells on one
24d40 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
24d50 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20  Space = 0;      
24d60 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
24d70 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
24d80 61 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 4d 65  aSpace[] */.  Me
24d90 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d  mPage *apOld[NB]
24da0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50  ;          /* pP
24db0 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77  age and up to tw
24dc0 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  o siblings */.  
24dd0 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d  Pgno pgnoOld[NB]
24de0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
24df0 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72  Page numbers for
24e00 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70   each page in ap
24e10 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61  Old[] */.  MemPa
24e20 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20  ge *apCopy[NB]; 
24e30 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61          /* Priva
24e40 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f  te copies of apO
24e50 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20  ld[] pages */.  
24e60 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e  MemPage *apNew[N
24e70 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  B+2];        /* 
24e80 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
24e90 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65  NB siblings afte
24ea0 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20  r balancing */. 
24eb0 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42   Pgno pgnoNew[NB
24ec0 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  +2];          /*
24ed0 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f   Page numbers fo
24ee0 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61  r each page in a
24ef0 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  pNew[] */.  u8 *
24f00 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20  apDiv[NB];      
24f10 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
24f20 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
24f30 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
24f40 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
24f50 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
24f60 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
24f70 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
24f80 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
24f90 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
24fa0 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
24fb0 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
24fc0 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
24fd0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
24fe0 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
24ff0 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
25000 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
25010 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
25020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25030 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
25040 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
25050 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
25060 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20   *aCopy[NB];    
25070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
25080 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ace for holding 
25090 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d  data of apCopy[]
250a0 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65   */.  u8 *aSpace
250b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
250c0 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
250d0 6f 6c 64 20 63 6f 70 69 65 73 20 6f 66 20 64 69  old copies of di
250e0 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a  viders cells */.
250f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25100 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
25110 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a   u8 *aFrom = 0;.
25120 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
25130 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
25140 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
25150 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
25160 20 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20   .  ** Find the 
25170 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 2a  parent page..  *
25180 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
25190 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
251a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
251b0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
251c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 7c  Page->pDbPage) |
251d0 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  | pPage->nOverfl
251e0 6f 77 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d  ow==1 );.  pBt =
251f0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70   pPage->pBt;.  p
25200 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
25210 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72  pParent;.  asser
25220 74 28 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20  t( pParent );.  
25230 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
25240 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
25250 72 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e  rWrite(pParent->
25260 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20  pDbPage)) ){.   
25270 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
25280 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
25290 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64  E: begin page %d
252a0 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c   child of %d\n",
252b0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50   pPage->pgno, pP
252c0 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a  arent->pgno));..
252d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
252e0 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
252f0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65  .  /*.  ** A spe
25300 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61  cial case:  If a
25310 20 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a   new entry has j
25320 75 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ust been inserte
25330 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61  d into a.  ** ta
25340 62 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61 20  ble (that is, a 
25350 62 74 72 65 65 20 77 69 74 68 20 69 6e 74 65 67  btree with integ
25360 65 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20  er keys and all 
25370 64 61 74 61 20 61 74 20 74 68 65 20 6c 65 61 76  data at the leav
25380 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  es).  ** and the
25390 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74 68   new entry is th
253a0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
253b0 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 28  ry in the tree (
253c0 69 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20  it has the.  ** 
253d0 6c 61 72 67 65 73 74 20 6b 65 79 29 20 74 68 65  largest key) the
253e0 6e 20 75 73 65 20 74 68 65 20 73 70 65 63 69 61  n use the specia
253f0 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  l balance_quick(
25400 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20  ) routine for.  
25410 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62  ** balancing.  b
25420 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
25430 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e  s much faster an
25440 64 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  d results in a t
25450 69 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b  ighter.  ** pack
25460 69 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74  ing of data in t
25470 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
25480 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
25490 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20  ->leaf &&.      
254a0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
254b0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6c 65  .      pPage->le
254c0 61 66 44 61 74 61 20 26 26 0a 20 20 20 20 20 20  afData &&.      
254d0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
254e0 3d 3d 31 20 26 26 0a 20 20 20 20 20 20 70 50 61  ==1 &&.      pPa
254f0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ge->aOvfl[0].idx
25500 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26  ==pPage->nCell &
25510 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70  &.      pPage->p
25520 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20  Parent->pgno!=1 
25530 26 26 0a 20 20 20 20 20 20 67 65 74 34 62 79 74  &&.      get4byt
25540 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
25550 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
25560 66 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d  fset+8])==pPage-
25570 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 2f  >pgno.  ){.    /
25580 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43  *.    ** TODO: C
25590 68 65 63 6b 20 74 68 65 20 73 69 62 6c 69 6e 67  heck the sibling
255a0 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
255b0 20 70 50 61 67 65 2e 20 49 74 20 6d 61 79 20 62   pPage. It may b
255c0 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
255d0 65 79 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20  ey are not full 
255e0 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61 67 65 20  and no new page 
255f0 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
25600 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 62   */.    return b
25610 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61  alance_quick(pPa
25620 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  ge, pParent);.  
25630 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
25640 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
25650 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
25660 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
25670 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e)) ){.    retur
25680 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  n rc;.  }..  /*.
25690 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 65    ** Find the ce
256a0 6c 6c 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ll in the parent
256b0 20 70 61 67 65 20 77 68 6f 73 65 20 6c 65 66 74   page whose left
256c0 20 63 68 69 6c 64 20 70 6f 69 6e 74 73 20 62 61   child points ba
256d0 63 6b 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67 65  ck.  ** to pPage
256e0 2e 20 20 54 68 65 20 22 69 64 78 22 20 76 61 72  .  The "idx" var
256f0 69 61 62 6c 65 20 69 73 20 74 68 65 20 69 6e 64  iable is the ind
25700 65 78 20 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e  ex of that cell.
25710 20 20 49 66 20 70 50 61 67 65 0a 20 20 2a 2a 20    If pPage.  ** 
25720 69 73 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  is the rightmost
25730 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
25740 74 20 74 68 65 6e 20 73 65 74 20 69 64 78 20 74  t then set idx t
25750 6f 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  o pParent->nCell
25760 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61   .  */.  if( pPa
25770 72 65 6e 74 2d 3e 69 64 78 53 68 69 66 74 20 29  rent->idxShift )
25780 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
25790 0a 20 20 20 20 70 67 6e 6f 20 3d 20 70 50 61 67  .    pgno = pPag
257a0 65 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73  e->pgno;.    ass
257b0 65 72 74 28 20 70 67 6e 6f 3d 3d 73 71 6c 69 74  ert( pgno==sqlit
257c0 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
257d0 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
257e0 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 64 78  ) );.    for(idx
257f0 3d 30 3b 20 69 64 78 3c 70 50 61 72 65 6e 74 2d  =0; idx<pParent-
25800 3e 6e 43 65 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a  >nCell; idx++){.
25810 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
25820 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
25830 65 6e 74 2c 20 69 64 78 29 29 3d 3d 70 67 6e 6f  ent, idx))==pgno
25840 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
25850 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
25860 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
25870 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a  <pParent->nCell.
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
25890 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
258a0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
258b0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
258c0 3d 70 67 6e 6f 20 29 3b 0a 20 20 7d 65 6c 73 65  =pgno );.  }else
258d0 7b 0a 20 20 20 20 69 64 78 20 3d 20 70 50 61 67  {.    idx = pPag
258e0 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20  e->idxParent;.  
258f0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69  }..  /*.  ** Ini
25900 74 69 61 6c 69 7a 65 20 76 61 72 69 61 62 6c 65  tialize variable
25910 73 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  s so that it wil
25920 6c 20 62 65 20 73 61 66 65 20 74 6f 20 6a 75 6d  l be safe to jum
25930 70 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20  p.  ** directly 
25940 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
25950 75 70 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74  up at any moment
25960 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20  ..  */.  nOld = 
25970 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 73 71 6c 69  nNew = 0;.  sqli
25980 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72  te3PagerRef(pPar
25990 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a  ent->pDbPage);..
259a0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73    /*.  ** Find s
259b0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20  ibling pages to 
259c0 70 50 61 67 65 20 61 6e 64 20 74 68 65 20 63 65  pPage and the ce
259d0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 74  lls in pParent t
259e0 68 61 74 20 64 69 76 69 64 65 0a 20 20 2a 2a 20  hat divide.  ** 
259f0 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 20 41  the siblings.  A
25a00 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
25a10 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62  e to find NN sib
25a20 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 0a  lings on either.
25a30 20 20 2a 2a 20 73 69 64 65 20 6f 66 20 70 50 61    ** side of pPa
25a40 67 65 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e  ge.  More siblin
25a50 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  gs are taken fro
25a60 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65  m one side, howe
25a70 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61  ver, if.  ** pPa
25a80 67 65 20 74 68 65 72 65 20 61 72 65 20 66 65 77  ge there are few
25a90 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69  er than NN sibli
25aa0 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72  ngs on the other
25ab0 20 73 69 64 65 2e 20 20 49 66 20 70 50 61 72 65   side.  If pPare
25ac0 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f  nt.  ** has NB o
25ad0 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e  r fewer children
25ae0 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72   then all childr
25af0 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72  en of pParent ar
25b00 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20  e taken..  */.  
25b10 6e 78 44 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e  nxDiv = idx - NN
25b20 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 20 2b 20  ;.  if( nxDiv + 
25b30 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43  NB > pParent->nC
25b40 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  ell ){.    nxDiv
25b50 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   = pParent->nCel
25b60 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a  l - NB + 1;.  }.
25b70 20 20 69 66 28 20 6e 78 44 69 76 3c 30 20 29 7b    if( nxDiv<0 ){
25b80 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a  .    nxDiv = 0;.
25b90 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a    }.  nDiv = 0;.
25ba0 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44    for(i=0, k=nxD
25bb0 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b  iv; i<NB; i++, k
25bc0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70  ++){.    if( k<p
25bd0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
25be0 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
25bf0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
25c00 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44  nt, k);.      nD
25c10 69 76 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  iv++;.      asse
25c20 72 74 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65  rt( !pParent->le
25c30 61 66 20 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f  af );.      pgno
25c40 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74  Old[i] = get4byt
25c50 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
25c60 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50   }else if( k==pP
25c70 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
25c80 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d        pgnoOld[i]
25c90 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
25ca0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
25cb0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
25cc0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
25cd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25ce0 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  }.    rc = getAn
25cf0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
25d00 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c  gnoOld[i], &apOl
25d10 64 5b 69 5d 2c 20 70 50 61 72 65 6e 74 29 3b 0a  d[i], pParent);.
25d20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
25d30 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
25d40 70 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 2d  p;.    apOld[i]-
25d50 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 0a  >idxParent = k;.
25d60 20 20 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20      apCopy[i] = 
25d70 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  0;.    assert( i
25d80 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f  ==nOld );.    nO
25d90 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65  ld++;.    nMaxCe
25da0 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69  lls += 1+apOld[i
25db0 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69  ]->nCell+apOld[i
25dc0 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  ]->nOverflow;.  
25dd0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61  }..  /* Make nMa
25de0 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c  xCells a multipl
25df0 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20  e of 4 in order 
25e00 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79  to preserve 8-by
25e10 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e  te.  ** alignmen
25e20 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73  t */.  nMaxCells
25e30 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20   = (nMaxCells + 
25e40 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  3)&~3;..  /*.  *
25e50 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
25e60 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75   for memory stru
25e70 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 61 70  ctures.  */.  ap
25e80 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Cell = sqlite3_m
25e90 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 20 6e  alloc( .       n
25ea0 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
25eb0 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  u8*)            
25ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70             /* ap
25ed0 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e  Cell */.     + n
25ee0 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
25ef0 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20  u16)            
25f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a             /* sz
25f10 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 28  Cell */.     + (
25f20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
25f30 6d 50 61 67 65 29 29 2b 70 42 74 2d 3e 70 61 67  mPage))+pBt->pag
25f40 65 53 69 7a 65 29 2a 4e 42 20 20 2f 2a 20 61 43  eSize)*NB  /* aC
25f50 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42  opy */.     + pB
25f60 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20 20 20  t->pageSize*5   
25f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70            /* aSp
25f90 61 63 65 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49  ace */.     + (I
25fa0 53 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d  SAUTOVACUUM ? nM
25fb0 61 78 43 65 6c 6c 73 20 3a 20 30 29 20 20 20 20  axCells : 0)    
25fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 46 72            /* aFr
25fd0 6f 6d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28  om */.  );.  if(
25fe0 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20   apCell==0 ){.  
25ff0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
26000 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
26010 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
26020 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75   }.  szCell = (u
26030 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78  16*)&apCell[nMax
26040 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b  Cells];.  aCopy[
26050 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c  0] = (u8*)&szCel
26060 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
26070 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b  assert( ((aCopy[
26080 30 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  0] - (u8*)apCell
26090 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
260a0 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
260b0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 66   required */.  f
260c0 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b  or(i=1; i<NB; i+
260d0 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d  +){.    aCopy[i]
260e0 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70   = &aCopy[i-1][p
260f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55  Bt->pageSize+ROU
26100 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
26110 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72  ge))];.    asser
26120 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20  t( ((aCopy[i] - 
26130 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37  (u8*)apCell) & 7
26140 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74  )==0 ); /* 8-byt
26150 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75  e alignment requ
26160 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53  ired */.  }.  aS
26170 70 61 63 65 20 3d 20 26 61 43 6f 70 79 5b 4e 42  pace = &aCopy[NB
26180 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1][pBt->pageSiz
26190 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  e+ROUND8(sizeof(
261a0 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61 73  MemPage))];.  as
261b0 73 65 72 74 28 20 28 28 61 53 70 61 63 65 20 2d  sert( ((aSpace -
261c0 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20   (u8*)apCell) & 
261d0 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79  7)==0 ); /* 8-by
261e0 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71  te alignment req
261f0 75 69 72 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66  uired */.#ifndef
26200 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26210 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42  OVACUUM.  if( pB
26220 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
26230 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53  .    aFrom = &aS
26240 70 61 63 65 5b 35 2a 70 42 74 2d 3e 70 61 67 65  pace[5*pBt->page
26250 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69  Size];.  }.#endi
26260 66 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d  f.  .  /*.  ** M
26270 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
26280 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61  e content of pPa
26290 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
262a0 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e  ngs into aOld[].
262b0 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f  .  ** The rest o
262c0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
262d0 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72  will use data fr
262e0 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61  om the copies ra
262f0 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74  ther.  ** that t
26300 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
26310 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67  s since the orig
26320 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20  inal pages will 
26330 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70  be in the.  ** p
26340 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
26350 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a  overwritten..  *
26360 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
26370 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  Old; i++){.    M
26380 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f  emPage *p = apCo
26390 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65  py[i] = (MemPage
263a0 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20  *)aCopy[i];.    
263b0 6d 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b  memcpy(p, apOld[
263c0 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61  i], sizeof(MemPa
263d0 67 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61  ge));.    p->aDa
263e0 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31  ta = (void*)&p[1
263f0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  ];.    memcpy(p-
26400 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
26410 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
26420 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
26430 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
26440 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
26450 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
26460 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
26470 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
26480 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
26490 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
264a0 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
264b0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
264c0 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
264d0 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53  obtained form aS
264e0 70 61 63 65 5b 5d 20 61 6e 64 20 72 65 6d 6f 76  pace[] and remov
264f0 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64 65  e the the divide
26500 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f  r Cells.  ** fro
26510 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a  m pParent..  **.
26520 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c    ** If the sibl
26530 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66  ings are on leaf
26540 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65   pages, then the
26550 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20   child pointers 
26560 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69  of the.  ** divi
26570 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74  der cells are st
26580 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  ripped from the 
26590 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65  cells before the
265a0 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a  y are copied.  *
265b0 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 5b 5d 2e  * into aSpace[].
265c0 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61    In this way, a
265d0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
265e0 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74  ll[] are without
265f0 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e  .  ** child poin
26600 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e  ters.  If siblin
26610 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  gs are not leave
26620 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c  s, then all cell
26630 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b   in.  ** apCell[
26640 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20  ] include child 
26650 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65  pointers.  Eithe
26660 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  r way, all cells
26670 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a   in apCell[].  *
26680 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a  * are alike..  *
26690 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65  *.  ** leafCorre
266a0 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61  ction:  4 if pPa
266b0 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30  ge is a leaf.  0
266c0 20 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74   if pPage is not
266d0 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20   a leaf..  **   
266e0 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31      leafData:  1
266f0 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20   if pPage holds 
26700 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61  key+data and pPa
26710 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20  rent holds only 
26720 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65  keys..  */.  nCe
26730 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f  ll = 0;.  leafCo
26740 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65  rrection = pPage
26750 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
26760 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65  Data = pPage->le
26770 61 66 44 61 74 61 20 26 26 20 70 50 61 67 65 2d  afData && pPage-
26780 3e 6c 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30  >leaf;.  for(i=0
26790 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
267a0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
267b0 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20  d = apCopy[i];. 
267c0 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70     int limit = p
267d0 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d  Old->nCell+pOld-
267e0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
267f0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
26800 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; j++){.      as
26810 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
26820 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61  Cells );.      a
26830 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66  pCell[nCell] = f
26840 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
26850 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20  pOld, j);.      
26860 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
26870 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64  cellSizePtr(pOld
26880 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29  , apCell[nCell])
26890 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
268a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
268b0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
268c0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
268d0 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20        int a;.   
268e0 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
268f0 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66  ] = i;.        f
26900 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e  or(a=0; a<pOld->
26910 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b  nOverflow; a++){
26920 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
26930 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43  Old->aOvfl[a].pC
26940 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c  ell==apCell[nCel
26950 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l] ){.          
26960 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
26970 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20   0xFF;.         
26980 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
26990 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
269a0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
269b0 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
269c0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f    }.    if( i<nO
269d0 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 75 31  ld-1 ){.      u1
269e0 36 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50  6 sz = cellSizeP
269f0 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
26a00 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[i]);.      if(
26a10 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20   leafData ){.   
26a20 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65       /* With the
26a30 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20   LEAFDATA flag, 
26a40 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f  pParent cells ho
26a50 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20  ld only INTKEYs 
26a60 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
26a70 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f  are duplicates o
26a80 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68  f keys on the ch
26a90 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e  ild pages.  We n
26aa0 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20  eed to remove.  
26ab0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76        ** the div
26ac0 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20  ider cells from 
26ad0 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65  pParent, but the
26ae0 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
26af0 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  are not.        
26b00 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43 65  ** added to apCe
26b10 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65  ll[] because the
26b20 79 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73  y are duplicates
26b30 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e   of child cells.
26b40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26b50 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
26b60 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
26b70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26b80 20 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70         u8 *pTemp
26b90 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
26ba0 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
26bb0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43  s );.        szC
26bc0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
26bd0 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
26be0 20 26 61 53 70 61 63 65 5b 69 53 70 61 63 65 5d   &aSpace[iSpace]
26bf0 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61 63 65  ;.        iSpace
26c00 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20   += sz;.        
26c10 61 73 73 65 72 74 28 20 69 53 70 61 63 65 3c 3d  assert( iSpace<=
26c20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 35 20  pBt->pageSize*5 
26c30 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
26c40 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69  y(pTemp, apDiv[i
26c50 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  ], sz);.        
26c60 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
26c70 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63  pTemp+leafCorrec
26c80 74 69 6f 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51  tion;.#ifndef SQ
26c90 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
26ca0 43 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28  CUUM.        if(
26cb0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
26cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46   ){.          aF
26cd0 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46  rom[nCell] = 0xF
26ce0 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  F;.        }.#en
26cf0 64 69 66 0a 20 20 20 20 20 20 20 20 64 72 6f 70  dif.        drop
26d00 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
26d10 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  Div, sz);.      
26d20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
26d30 2d 3d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  -= leafCorrectio
26d40 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
26d50 74 28 20 67 65 74 34 62 79 74 65 28 70 54 65 6d  t( get4byte(pTem
26d60 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29  p)==pgnoOld[i] )
26d70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
26d80 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  Old->leaf ){.   
26d90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
26da0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
26db0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   );.          /*
26dc0 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74   The right point
26dd0 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
26de0 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65  page pOld become
26df0 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20  s the left.     
26e00 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20       ** pointer 
26e10 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
26e20 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ell */.         
26e30 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
26e40 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
26e50 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  ata[pOld->hdrOff
26e60 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  set+8], 4);.    
26e70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26e80 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
26e90 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
26ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26eb0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20  szCell[nCell]<4 
26ec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
26ed0 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  * Do not allow a
26ee0 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72  ny cells smaller
26ef0 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a   than 4 bytes. *
26f00 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  /.            sz
26f10 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b  Cell[nCell] = 4;
26f20 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
26f40 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Cell++;.      }.
26f50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
26f60 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20    ** Figure out 
26f70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
26f80 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  ges needed to ho
26f90 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c  ld all nCell cel
26fa0 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74  ls..  ** Store t
26fb0 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b  his number in "k
26fc0 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65  ".  Also compute
26fd0 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69   szNew[] which i
26fe0 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a  s the total.  **
26ff0 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
27000 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70  ls on the i-th p
27010 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d  age and cntNew[]
27020 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
27030 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65  dex.  ** in apCe
27040 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c  ll[] of the cell
27050 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61   that divides pa
27060 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69  ge i from page i
27070 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65  +1.  .  ** cntNe
27080 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61  w[k] should equa
27090 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20  l nCell..  **.  
270a0 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74  ** Values comput
270b0 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
270c0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
270d0 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74        k: The tot
270e0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  al number of sib
270f0 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20  ling pages.  ** 
27100 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61     szNew[i]: Spa
27110 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20  ced used on the 
27120 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
27130 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77  e..  **   cntNew
27140 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70  [i]: Index in ap
27150 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c  Cell[] and szCel
27160 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73  l[] for the firs
27170 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20  t cell to.  **  
27180 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
27190 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74  right of the i-t
271a0 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
271b0 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65    ** usableSpace
271c0 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  : Number of byte
271d0 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c  s of space avail
271e0 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62  able on each sib
271f0 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f  ling..  ** .  */
27200 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d  .  usableSpace =
27210 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
27220 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72   - 12 + leafCorr
27230 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75  ection;.  for(su
27240 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c  btotal=k=i=0; i<
27250 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
27260 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43   assert( i<nMaxC
27270 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74  ells );.    subt
27280 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69  otal += szCell[i
27290 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73  ] + 2;.    if( s
272a0 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65  ubtotal > usable
272b0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73  Space ){.      s
272c0 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
272d0 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  al - szCell[i];.
272e0 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20        cntNew[k] 
272f0 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  = i;.      if( l
27300 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20  eafData ){ i--; 
27310 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c  }.      subtotal
27320 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b   = 0;.      k++;
27330 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e  .    }.  }.  szN
27340 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
27350 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20  ;.  cntNew[k] = 
27360 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20  nCell;.  k++;.. 
27370 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63   /*.  ** The pac
27380 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79  king computed by
27390 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c   the previous bl
273a0 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f  ock is biased to
273b0 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67  ward the sibling
273c0 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65  s.  ** on the le
273d0 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65  ft side.  The le
273e0 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  ft siblings are 
273f0 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75  always nearly fu
27400 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20  ll, while the.  
27410 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  ** right-most si
27420 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e  bling might be n
27430 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  early empty.  Th
27440 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  is block of code
27450 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74   attempts.  ** t
27460 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63  o adjust the pac
27470 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73  king of siblings
27480 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72   to get a better
27490 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20   balance..  **. 
274a0 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d   ** This adjustm
274b0 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  ent is more than
274c0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
274d0 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61  .  The packing a
274e0 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20  bove might.  ** 
274f0 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c  be so out of bal
27500 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c  ance as to be il
27510 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d  legal.  For exam
27520 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d  ple, the right-m
27530 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67  ost.  ** sibling
27540 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65   might be comple
27550 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  tely empty.  Thi
27560 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
27570 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20  not optional..  
27580 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20  */.  for(i=k-1; 
27590 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  i>0; i--){.    i
275a0 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e  nt szRight = szN
275b0 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20  ew[i];  /* Size 
275c0 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
275d0 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69  e right */.    i
275e0 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65  nt szLeft = szNe
275f0 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20  w[i-1]; /* Size 
27600 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
27610 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e  e left */.    in
27620 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  t r;            
27630 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69    /* Index of ri
27640 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e  ght-most cell in
27650 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f   left sibling */
27660 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20  .    int d;     
27670 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
27680 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  x of first cell 
27690 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72  to the left of r
276a0 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  ight sibling */.
276b0 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b  .    r = cntNew[
276c0 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20  i-1] - 1;.    d 
276d0 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
276e0 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
276f0 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  d<nMaxCells );. 
27700 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61     assert( r<nMa
27710 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68  xCells );.    wh
27720 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20  ile( szRight==0 
27730 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c  || szRight+szCel
27740 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28  l[d]+2<=szLeft-(
27750 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a  szCell[r]+2) ){.
27760 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d        szRight +=
27770 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a   szCell[d] + 2;.
27780 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20        szLeft -= 
27790 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20  szCell[r] + 2;. 
277a0 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d       cntNew[i-1]
277b0 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e  --;.      r = cn
277c0 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
277d0 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d       d = r + 1 -
277e0 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d   leafData;.    }
277f0 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20  .    szNew[i] = 
27800 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e  szRight;.    szN
27810 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74  ew[i-1] = szLeft
27820 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68  ;.  }..  /* Eith
27830 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20  er we found one 
27840 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63  or more cells (c
27850 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20  ntnew[0])>0) or 
27860 77 65 20 61 72 65 20 74 68 65 0a 20 20 2a 2a 20  we are the.  ** 
27870 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
27880 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20  age.  A virtual 
27890 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65  root page is whe
278a0 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a  n the real root.
278b0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67    ** page is pag
278c0 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74  e 1 and we are t
278d0 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66  he only child of
278e0 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f   that page..  */
278f0 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65  .  assert( cntNe
27900 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65  w[0]>0 || (pPare
27910 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70  nt->pgno==1 && p
27920 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30  Parent->nCell==0
27930 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ) );..  /*.  ** 
27940 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
27950 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
27960 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
27970 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  sible..  */.  as
27980 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
27990 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c 61  o>1 );.  pageFla
279a0 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  gs = pPage->aDat
279b0 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  a[0];.  for(i=0;
279c0 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
279d0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
279e0 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b     if( i<nOld ){
279f0 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70  .      pNew = ap
27a00 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69  New[i] = apOld[i
27a10 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
27a20 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d  [i] = pgnoOld[i]
27a30 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ;.      apOld[i]
27a40 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
27a50 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27a60 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  te(pNew->pDbPage
27a70 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  );.      nNew++;
27a80 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
27a90 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
27aa0 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  anup;.    }else{
27ab0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
27ac0 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  >0 );.      rc =
27ad0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
27ae0 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
27af0 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f  pgnoNew[i], pgno
27b00 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20  New[i-1], 0);.  
27b10 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
27b20 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
27b30 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  p;.      apNew[i
27b40 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
27b50 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nNew++;.    }.  
27b60 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
27b70 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 7d   pageFlags);.  }
27b80 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
27b90 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77  old pages that w
27ba0 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61  ere not reused a
27bb0 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  s new pages..  *
27bc0 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c  /.  while( i<nOl
27bd0 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72  d ){.    rc = fr
27be0 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  eePage(apOld[i])
27bf0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
27c00 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
27c10 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  nup;.    release
27c20 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
27c30 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
27c40 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  ;.    i++;.  }..
27c50 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68    /*.  ** Put th
27c60 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61  e new pages in a
27c70 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  ccending order. 
27c80 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20   This helps to. 
27c90 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73   ** keep entries
27ca0 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
27cb0 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68  e in order so th
27cc0 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f  at a scan.  ** o
27cd0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61  f the table is a
27ce0 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72   linear scan thr
27cf0 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20  ough the file.  
27d00 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72  That.  ** in tur
27d10 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72  n helps the oper
27d20 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20  ating system to 
27d30 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20  deliver pages.  
27d40 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ** from the disk
27d50 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20   more rapidly.. 
27d60 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e   **.  ** An O(n^
27d70 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72  2) insertion sor
27d80 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75  t algorithm is u
27d90 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20  sed, but since. 
27da0 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d   ** n is never m
27db0 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73  ore than NB (a s
27dc0 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20  mall constant), 
27dd0 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  that should.  **
27de0 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
27df0 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  m..  **.  ** Whe
27e00 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e  n NB==3, this on
27e10 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d  e optimization m
27e20 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73  akes the databas
27e30 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25  e.  ** about 25%
27e40 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67   faster for larg
27e50 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64  e insertions and
27e60 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f   deletions..  */
27e70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d  .  for(i=0; i<k-
27e80 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  1; i++){.    int
27e90 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b   minV = pgnoNew[
27ea0 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49  i];.    int minI
27eb0 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = i;.    for(j=
27ec0 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a  i+1; j<k; j++){.
27ed0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65        if( pgnoNe
27ee0 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d  w[j]<(unsigned)m
27ef0 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  inV ){.        m
27f00 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  inI = j;.       
27f10 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b   minV = pgnoNew[
27f20 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  j];.      }.    
27f30 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69  }.    if( minI>i
27f40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b   ){.      int t;
27f50 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
27f60 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67  pT;.      t = pg
27f70 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20  noNew[i];.      
27f80 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  pT = apNew[i];. 
27f90 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20       pgnoNew[i] 
27fa0 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b  = pgnoNew[minI];
27fb0 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
27fc0 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  = apNew[minI];. 
27fd0 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e       pgnoNew[min
27fe0 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70  I] = t;.      ap
27ff0 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a  New[minI] = pT;.
28000 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43      }.  }.  TRAC
28010 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64  E(("BALANCE: old
28020 3a 20 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a  : %d %d %d  new:
28030 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
28040 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
28050 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f  %d)\n",.    pgno
28060 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c  Old[0], .    nOl
28070 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31  d>=2 ? pgnoOld[1
28080 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e  ] : 0,.    nOld>
28090 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20  =3 ? pgnoOld[2] 
280a0 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77  : 0,.    pgnoNew
280b0 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20  [0], szNew[0],. 
280c0 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e     nNew>=2 ? pgn
280d0 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[1] : 0, nNe
280e0 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20  w>=2 ? szNew[1] 
280f0 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33  : 0,.    nNew>=3
28100 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20   ? pgnoNew[2] : 
28110 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e  0, nNew>=3 ? szN
28120 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[2] : 0,.    n
28130 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77  New>=4 ? pgnoNew
28140 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34  [3] : 0, nNew>=4
28150 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c   ? szNew[3] : 0,
28160 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70  .    nNew>=5 ? p
28170 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e  gnoNew[4] : 0, n
28180 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34  New>=5 ? szNew[4
28190 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20  ] : 0));..  /*. 
281a0 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72   ** Evenly distr
281b0 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69  ibute the data i
281c0 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73  n apCell[] acros
281d0 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e  s the new pages.
281e0 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76  .  ** Insert div
281f0 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ider cells into 
28200 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73  pParent as neces
28210 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d  sary..  */.  j =
28220 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
28230 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
28240 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65   /* Assemble the
28250 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
28260 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  e. */.    MemPag
28270 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
28280 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
28290 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
282a0 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
282b0 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69  >pgno==pgnoNew[i
282c0 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c  ] );.    assembl
282d0 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e  ePage(pNew, cntN
282e0 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c  ew[i]-j, &apCell
282f0 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29  [j], &szCell[j])
28300 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
28310 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28  ew->nCell>0 || (
28320 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65  nNew==1 && cntNe
28330 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20  w[0]==0) );.    
28340 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
28350 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 23  verflow==0 );..#
28360 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28370 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
28380 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
28390 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
283a0 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
283b0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
283c0 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74  entries.    ** t
283d0 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  hat point to the
283e0 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77   siblings that w
283f0 65 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20  ere rearranged. 
28400 54 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65  These can be: le
28410 66 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72  ft.    ** childr
28420 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65  en of cells, the
28430 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
28440 74 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65  the page, or ove
28450 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20  rflow pages.    
28460 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
28470 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20   cells..    */. 
28480 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
28490 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
284a0 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65  for(k=j; k<cntNe
284b0 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  w[i]; k++){.    
284c0 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d      assert( k<nM
284d0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
284e0 20 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d     if( aFrom[k]=
284f0 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b  =0xFF || apCopy[
28500 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21  aFrom[k]]->pgno!
28510 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20  =pNew->pgno ){. 
28520 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74           rc = pt
28530 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77  rmapPutOvfl(pNew
28540 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20  , k-j);.        
28550 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28560 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
28570 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
28580 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
28590 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
285a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
285b0 64 69 66 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74  dif..    j = cnt
285c0 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20  New[i];..    /* 
285d0 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
285e0 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
285f0 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20  ove was not the 
28600 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
28610 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ng,.    ** inser
28620 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  t a divider cell
28630 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
28640 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
28650 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26    if( i<nNew-1 &
28660 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  & j<nCell ){.   
28670 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
28680 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
28690 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20       int sz;..  
286a0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
286b0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
286c0 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b   pCell = apCell[
286d0 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73  j];.      sz = s
286e0 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43  zCell[j] + leafC
286f0 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
28700 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66   if( !pNew->leaf
28710 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
28720 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b  py(&pNew->aData[
28730 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20  8], pCell, 4);. 
28740 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30         pTemp = 0
28750 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
28760 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
28770 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
28780 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64  tree is a leaf-d
28790 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68  ata tree, and th
287a0 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c  e siblings are l
287b0 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20  eaves, .        
287c0 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
287d0 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c   no divider cell
287e0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e   in apCell[]. In
287f0 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64  stead, the divid
28800 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  er .        ** c
28810 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
28820 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
28830 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  for the right-mo
28840 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20  st cell of .    
28850 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69      ** the sibli
28860 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng-page assemble
28870 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20  d above only..  
28880 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28890 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
288a0 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20          j--;.   
288b0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
288c0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e  eParseCellPtr(pN
288d0 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  ew, apCell[j], &
288e0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  info);.        p
288f0 43 65 6c 6c 20 3d 20 26 61 53 70 61 63 65 5b 69  Cell = &aSpace[i
28900 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 20 20  Space];.        
28910 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65  fillInCell(pPare
28920 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e  nt, pCell, 0, in
28930 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30  fo.nKey, 0, 0, 0
28940 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  , &sz);.        
28950 69 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  iSpace += sz;.  
28960 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
28970 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  pace<=pBt->pageS
28980 69 7a 65 2a 35 20 29 3b 0a 20 20 20 20 20 20 20  ize*5 );.       
28990 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20   pTemp = 0;.    
289a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
289b0 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20   pCell -= 4;.   
289c0 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53       pTemp = &aS
289d0 70 61 63 65 5b 69 53 70 61 63 65 5d 3b 0a 20 20  pace[iSpace];.  
289e0 20 20 20 20 20 20 69 53 70 61 63 65 20 2b 3d 20        iSpace += 
289f0 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
28a00 72 74 28 20 69 53 70 61 63 65 3c 3d 70 42 74 2d  rt( iSpace<=pBt-
28a10 3e 70 61 67 65 53 69 7a 65 2a 35 20 29 3b 0a 20  >pageSize*5 );. 
28a20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72         /* Obscur
28a30 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c  e case for non-l
28a40 65 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20  eaf-data trees: 
28a50 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70  If the cell at p
28a60 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20  Cell was.       
28a70 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73   ** previously s
28a80 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20  tored on a leaf 
28a90 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65  node, and its re
28aa0 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73 20  ported size was 
28ab0 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  4.        ** byt
28ac0 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  es, then it may 
28ad0 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c  actually be smal
28ae0 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20  ler than this . 
28af0 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20 73         ** (see s
28b00 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
28b10 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74  CellPtr(), 4 byt
28b20 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75  es is the minimu
28b30 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20  m size of.      
28b40 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20    ** any cell). 
28b50 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74  But it is import
28b60 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20  ant to pass the 
28b70 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20  correct size to 
28b80 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65  .        ** inse
28b90 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70  rtCell(), so rep
28ba0 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f  arse the cell no
28bb0 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  w..        **.  
28bc0 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
28bd0 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65  at this can neve
28be0 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53  r happen in an S
28bf0 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c  QLite data file,
28c00 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20   as all.        
28c10 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20  ** cells are at 
28c20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49  least 4 bytes. I
28c30 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69  t only happens i
28c40 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20  n b-trees used. 
28c50 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61         ** to eva
28c60 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43  luate "IN (SELEC
28c70 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69  T ...)" and simi
28c80 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20  lar clauses..   
28c90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28ca0 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34  if( szCell[j]==4
28cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
28cc0 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74  sert(leafCorrect
28cd0 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20  ion==4);.       
28ce0 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65     sz = cellSize
28cf0 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65  Ptr(pParent, pCe
28d00 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ll);.        }. 
28d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
28d20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
28d30 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65  rent, nxDiv, pCe
28d40 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34  ll, sz, pTemp, 4
28d50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
28d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
28d70 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
28d80 70 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  p;.      put4byt
28d90 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65  e(findOverflowCe
28da0 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69 76  ll(pParent,nxDiv
28db0 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a  ), pNew->pgno);.
28dc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28dd0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
28de0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
28df0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
28e00 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20  m database, and 
28e10 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61 20  not a leaf-data 
28e20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  tree,.      ** t
28e30 68 65 6e 20 75 70 64 61 74 65 20 74 68 65 20 70  hen update the p
28e40 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68 20  ointer map with 
28e50 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  an entry for the
28e60 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
28e70 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65       ** that the
28e80 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72   cell just inser
28e90 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28 69  ted points to (i
28ea0 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f  f any)..      */
28eb0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
28ec0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 21 6c  autoVacuum && !l
28ed0 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20  eafData ){.     
28ee0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
28ef0 74 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20 6e  tOvfl(pParent, n
28f00 78 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20 69  xDiv);.        i
28f10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28f20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
28f30 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
28f40 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  up;.        }.  
28f50 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
28f60 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78     j++;.      nx
28f70 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Div++;.    }.  }
28f80 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43  .  assert( j==nC
28f90 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
28fa0 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73   nOld>0 );.  ass
28fb0 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20  ert( nNew>0 );. 
28fc0 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20   if( (pageFlags 
28fd0 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29  & PTF_LEAF)==0 )
28fe0 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70  {.    memcpy(&ap
28ff0 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61  New[nNew-1]->aDa
29000 74 61 5b 38 5d 2c 20 26 61 70 43 6f 70 79 5b 6e  ta[8], &apCopy[n
29010 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d  Old-1]->aData[8]
29020 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 4);.  }.  if( 
29030 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e  nxDiv==pParent->
29040 6e 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e  nCell+pParent->n
29050 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
29060 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69  /* Right-most si
29070 62 6c 69 6e 67 20 69 73 20 74 68 65 20 72 69 67  bling is the rig
29080 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66  ht-most child of
29090 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20   pParent */.    
290a0 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  put4byte(&pParen
290b0 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
290c0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
290d0 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29  pgnoNew[nNew-1])
290e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
290f0 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * Right-most sib
29100 6c 69 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74  ling is the left
29110 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69   child of the fi
29120 72 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61  rst entry in pPa
29130 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74  rent.    ** past
29140 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
29150 64 69 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f  divider entry */
29160 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69  .    put4byte(fi
29170 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
29180 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20  Parent, nxDiv), 
29190 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29  pgnoNew[nNew-1])
291a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
291b0 20 52 65 70 61 72 65 6e 74 20 63 68 69 6c 64 72   Reparent childr
291c0 65 6e 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 2e  en of all cells.
291d0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
291e0 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
291f0 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74     rc = reparent
29200 43 68 69 6c 64 50 61 67 65 73 28 61 70 4e 65 77  ChildPages(apNew
29210 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
29220 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
29230 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
29240 75 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72  up;.  }.  rc = r
29250 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65  eparentChildPage
29260 73 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66  s(pParent);.  if
29270 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29280 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
29290 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 0a 20 20  leanup;..  /*.  
292a0 2a 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20 70  ** Balance the p
292b0 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f 74  arent page.  Not
292c0 65 20 74 68 61 74 20 74 68 65 20 63 75 72 72 65  e that the curre
292d0 6e 74 20 70 61 67 65 20 28 70 50 61 67 65 29 20  nt page (pPage) 
292e0 6d 69 67 68 74 0a 20 20 2a 2a 20 68 61 76 65 20  might.  ** have 
292f0 62 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74 68  been added to th
29300 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 69 74  e freelist so it
29310 20 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65 72   might no longer
29320 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
29330 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 70 61  .  ** But the pa
29340 72 65 6e 74 20 70 61 67 65 20 77 69 6c 6c 20 61  rent page will a
29350 6c 77 61 79 73 20 62 65 20 69 6e 69 74 69 61 6c  lways be initial
29360 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ized..  */.  ass
29370 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73  ert( pParent->is
29380 49 6e 69 74 20 29 3b 0a 20 20 72 63 20 3d 20 62  Init );.  rc = b
29390 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20  alance(pParent, 
293a0 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a  0);.  .  /*.  **
293b0 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20   Cleanup before 
293c0 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a  returning..  */.
293d0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a  balance_cleanup:
293e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
293f0 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69  apCell);.  for(i
29400 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
29410 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
29420 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d  e(apOld[i]);.  }
29430 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
29440 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ew; i++){.    re
29450 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b  leasePage(apNew[
29460 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  i]);.  }.  relea
29470 73 65 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b  sePage(pParent);
29480 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
29490 43 45 3a 20 66 69 6e 69 73 68 65 64 20 77 69 74  CE: finished wit
294a0 68 20 25 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77  h %d: old=%d new
294b0 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c  =%d cells=%d\n",
294c0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
294d0 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e  ->pgno, nOld, nN
294e0 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 72  ew, nCell));.  r
294f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
29500 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
29510 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  is called for th
29520 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  e root page of a
29530 20 62 74 72 65 65 20 77 68 65 6e 20 74 68 65 20   btree when the 
29540 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e  root.** page con
29550 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20  tains no cells. 
29560 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 70 6f   This is an oppo
29570 72 74 75 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20  rtunity to make 
29580 74 68 65 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c  the tree.** shal
29590 6c 6f 77 65 72 20 62 79 20 6f 6e 65 20 6c 65 76  lower by one lev
295a0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
295b0 74 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  t balance_shallo
295c0 77 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  wer(MemPage *pPa
295d0 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
295e0 70 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  pChild;         
295f0 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
29600 63 68 69 6c 64 20 70 61 67 65 20 6f 66 20 70 50  child page of pP
29610 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  age */.  Pgno pg
29620 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20  noChild;        
29630 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
29640 6d 62 65 72 20 66 6f 72 20 70 43 68 69 6c 64 20  mber for pChild 
29650 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
29660 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
29670 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
29680 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75   from subprocedu
29690 72 65 73 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  res */.  BtShare
296a0 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
296b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
296c0 6d 61 69 6e 20 42 54 72 65 65 20 73 74 72 75 63  main BTree struc
296d0 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ture */.  int mx
296e0 43 65 6c 6c 50 65 72 50 61 67 65 3b 20 20 20 20  CellPerPage;    
296f0 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
29700 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  m number of cell
29710 73 20 70 65 72 20 70 61 67 65 20 2a 2f 0a 20 20  s per page */.  
29720 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20  u8 **apCell;    
29730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29740 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70  All cells from p
29750 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e  ages being balan
29760 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  ced */.  u16 *sz
29770 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
29780 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73        /* Local s
29790 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
297a0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
297b0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30  Page->pParent==0
297c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
297d0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
297e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
297f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
29800 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
29810 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67   );.  pBt = pPag
29820 65 2d 3e 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c  e->pBt;.  mxCell
29830 50 65 72 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c  PerPage = MX_CEL
29840 4c 28 70 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c  L(pBt);.  apCell
29850 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
29860 63 28 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  c( mxCellPerPage
29870 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69  *(sizeof(u8*)+si
29880 7a 65 6f 66 28 75 31 36 29 29 20 29 3b 0a 20 20  zeof(u16)) );.  
29890 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20  if( apCell==0 ) 
298a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
298b0 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  MEM;.  szCell = 
298c0 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6d 78  (u16*)&apCell[mx
298d0 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20  CellPerPage];.  
298e0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
298f0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ){.    /* The ta
29900 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ble is completel
29910 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54  y empty */.    T
29920 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
29930 65 6d 70 74 79 20 74 61 62 6c 65 20 25 64 5c 6e  empty table %d\n
29940 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29  ", pPage->pgno))
29950 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
29960 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
29970 69 73 20 65 6d 70 74 79 20 62 75 74 20 68 61 73  is empty but has
29980 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54 72 61   one child.  Tra
29990 6e 73 66 65 72 20 74 68 65 0a 20 20 20 20 2a 2a  nsfer the.    **
299a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
299b0 6d 20 74 68 61 74 20 6f 6e 65 20 63 68 69 6c 64  m that one child
299c0 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20 70   into the root p
299d0 61 67 65 20 69 66 20 69 74 20 0a 20 20 20 20 2a  age if it .    *
299e0 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20 54 68 69  * will fit.  Thi
299f0 73 20 72 65 64 75 63 65 73 20 74 68 65 20 64 65  s reduces the de
29a00 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  pth of the tree 
29a10 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20  by one..    **. 
29a20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f     ** If the roo
29a30 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31  t page is page 1
29a40 2c 20 69 74 20 68 61 73 20 6c 65 73 73 20 73 70  , it has less sp
29a50 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 68  ace available th
29a60 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73 20 63 68  an.    ** its ch
29a70 69 6c 64 20 28 64 75 65 20 74 6f 20 74 68 65 20  ild (due to the 
29a80 31 30 30 20 62 79 74 65 20 68 65 61 64 65 72 20  100 byte header 
29a90 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74  that occurs at t
29aa0 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  he beginning.   
29ab0 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62   ** of the datab
29ac0 61 73 65 20 66 6c 65 29 2c 20 73 6f 20 69 74 20  ase fle), so it 
29ad0 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 62 6c  might not be abl
29ae0 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66  e to hold all of
29af0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66   the .    ** inf
29b00 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e 74  ormation current
29b10 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  ly contained in 
29b20 74 68 65 20 63 68 69 6c 64 2e 20 20 49 66 20 74  the child.  If t
29b30 68 69 73 20 69 73 20 74 68 65 20 0a 20 20 20 20  his is the .    
29b40 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e 20 64 6f  ** case, then do
29b50 20 6e 6f 74 20 64 6f 20 74 68 65 20 74 72 61 6e   not do the tran
29b60 73 66 65 72 2e 20 20 4c 65 61 76 65 20 70 61 67  sfer.  Leave pag
29b70 65 20 31 20 65 6d 70 74 79 20 65 78 63 65 70 74  e 1 empty except
29b80 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
29b90 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f  right-pointer to
29ba0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e   the child page.
29bb0 20 20 54 68 65 20 63 68 69 6c 64 20 70 61 67 65    The child page
29bc0 20 62 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20   becomes.    ** 
29bd0 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
29be0 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 20 20   of the tree..  
29bf0 20 20 2a 2f 0a 20 20 20 20 70 67 6e 6f 43 68 69    */.    pgnoChi
29c00 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ld = get4byte(&p
29c10 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
29c20 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
29c30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
29c40 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20  noChild>0 );.   
29c50 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69   assert( pgnoChi
29c60 6c 64 3c 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ld<=sqlite3Pager
29c70 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 2d  Pagecount(pPage-
29c80 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 3b  >pBt->pPager) );
29c90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
29ca0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 50  3BtreeGetPage(pP
29cb0 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68  age->pBt, pgnoCh
29cc0 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30 29  ild, &pChild, 0)
29cd0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
29ce0 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
29cf0 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28  balance;.    if(
29d00 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20   pPage->pgno==1 
29d10 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
29d20 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
29d30 67 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65  ge(pChild, pPage
29d40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
29d50 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c  ) goto end_shall
29d60 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20  ow_balance;.    
29d70 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
29d80 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
29d90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 68 69  ;.      if( pChi
29da0 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29  ld->nFree>=100 )
29db0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
29dc0 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69   child informati
29dd0 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  on will fit on t
29de0 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f  he root page, so
29df0 20 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   do the.        
29e00 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20  ** copy */.     
29e10 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
29e20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
29e30 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b  , pChild->aData[
29e40 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  0]);.        for
29e50 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e  (i=0; i<pChild->
29e60 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
29e70 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d         apCell[i]
29e80 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68 69   = findCell(pChi
29e90 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ld,i);.         
29ea0 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c   szCell[i] = cel
29eb0 6c 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64 2c  lSizePtr(pChild,
29ec0 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20   apCell[i]);.   
29ed0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
29ee0 73 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61 67  ssemblePage(pPag
29ef0 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  e, pChild->nCell
29f00 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  , apCell, szCell
29f10 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  );.        /* Co
29f20 70 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69  py the right-poi
29f30 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  nter of the chil
29f40 64 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e  d to the parent.
29f50 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 34   */.        put4
29f60 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
29f70 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
29f80 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20  set+8], .       
29f90 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
29fa0 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68  Child->aData[pCh
29fb0 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ild->hdrOffset+8
29fc0 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65  ]));.        fre
29fd0 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
29fe0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42         TRACE(("B
29ff0 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64  ALANCE: child %d
2a000 20 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61 67   transfer to pag
2a010 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e  e 1\n", pChild->
2a020 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65  pgno));.      }e
2a030 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2a040 54 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d 6f  The child has mo
2a050 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  re information t
2a060 68 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  hat will fit on 
2a070 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20  the root..      
2a080 20 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73    ** The tree is
2a090 20 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65   already balance
2a0a0 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20  d.  Do nothing. 
2a0b0 2a 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  */.        TRACE
2a0c0 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c  (("BALANCE: chil
2a0d0 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  d %d will not fi
2a0e0 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20  t on page 1\n", 
2a0f0 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
2a100 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2a110 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  e{.      memcpy(
2a120 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 43  pPage->aData, pC
2a130 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50 61  hild->aData, pPa
2a140 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2a150 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ize);.      pPag
2a160 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
2a170 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72       pPage->pPar
2a180 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ent = 0;.      r
2a190 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2a1a0 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  InitPage(pPage, 
2a1b0 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
2a1c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a1d0 29 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61 67  );.      freePag
2a1e0 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  e(pChild);.     
2a1f0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2a200 3a 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64  : transfer child
2a210 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64   %d into root %d
2a220 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2a230 20 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c     pChild->pgno,
2a240 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
2a250 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72      }.    rc = r
2a260 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65  eparentChildPage
2a270 73 28 70 50 61 67 65 29 3b 0a 20 20 20 20 61 73  s(pPage);.    as
2a280 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2a290 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66  erflow==0 );.#if
2a2a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2a2b0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2a2c0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2a2d0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  uum ){.      int
2a2e0 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
2a2f0 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
2a300 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  l; i++){ .      
2a310 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2a320 4f 76 66 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Ovfl(pPage, i);.
2a330 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2a340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a350 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2a360 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b  shallow_balance;
2a370 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a380 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
2a390 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2a3a0 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64  pChild);.  }.end
2a3b0 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
2a3c0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
2a3d0 28 61 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75  (apCell);.  retu
2a3e0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2a3f0 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   The root page i
2a400 73 20 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a  s overfull.**.**
2a410 20 57 68 65 6e 20 74 68 69 73 20 68 61 70 70 65   When this happe
2a420 6e 73 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77  ns, Create a new
2a430 20 63 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20   child page and 
2a440 63 6f 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  copy the.** cont
2a450 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74  ents of the root
2a460 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e   into the child.
2a470 20 20 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20    Then make the 
2a480 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20  root.** page an 
2a490 65 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20  empty page with 
2a4a0 72 69 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74  rightChild point
2a4b0 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a  ing to the new.*
2a4c0 2a 20 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c  * child.   Final
2a4d0 6c 79 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  ly, call balance
2a4e0 5f 69 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74  _internal() on t
2a4f0 68 65 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20  he new child.** 
2a500 74 6f 20 63 61 75 73 65 20 69 74 20 74 6f 20 73  to cause it to s
2a510 70 6c 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  plit..*/.static 
2a520 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
2a530 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
2a540 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
2a550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2a560 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73  urn value from s
2a570 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
2a580 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
2a590 64 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  d;    /* Pointer
2a5a0 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
2a5b0 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  page */.  Pgno p
2a5c0 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a  gnoChild;     /*
2a5d0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
2a5e0 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
2a5f0 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
2a600 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f   *pBt;         /
2a610 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20  * The BTree */. 
2a620 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
2a630 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73       /* Total us
2a640 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70  able size of a p
2a650 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  age */.  u8 *dat
2a660 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a;           /* 
2a670 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  Content of the p
2a680 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  arent page */.  
2a690 75 38 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20  u8 *cdata;      
2a6a0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
2a6b0 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
2a6c0 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
2a6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
2a6e0 73 65 74 20 74 6f 20 70 61 67 65 20 68 65 61 64  set to page head
2a6f0 65 72 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a  er in parent */.
2a700 20 20 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20    int brk;      
2a710 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2a720 74 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69  to content of fi
2a730 72 73 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65  rst cell in pare
2a740 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
2a750 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d   pPage->pParent=
2a760 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2a770 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2a780 3e 30 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  >0 );.  pBt = pP
2a790 61 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  age->pBt;.  asse
2a7a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2a7b0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2a7c0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c 6c  x) );.  rc = all
2a7d0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2a7e0 42 74 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67  Bt, &pChild, &pg
2a7f0 6e 6f 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e  noChild, pPage->
2a800 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20  pgno, 0);.  if( 
2a810 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2a820 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2a830 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2a840 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67  e(pChild->pDbPag
2a850 65 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  e) );.  usableSi
2a860 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
2a870 53 69 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20 70  Size;.  data = p
2a880 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
2a890 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
2a8a0 66 66 73 65 74 3b 0a 20 20 62 72 6b 20 3d 20 67  ffset;.  brk = g
2a8b0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2a8c0 72 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d  r+5]);.  cdata =
2a8d0 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a   pChild->aData;.
2a8e0 20 20 6d 65 6d 63 70 79 28 63 64 61 74 61 2c 20    memcpy(cdata, 
2a8f0 26 64 61 74 61 5b 68 64 72 5d 2c 20 70 50 61 67  &data[hdr], pPag
2a900 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  e->cellOffset+2*
2a910 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72  pPage->nCell-hdr
2a920 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63 64 61  );.  memcpy(&cda
2a930 74 61 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62  ta[brk], &data[b
2a940 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d  rk], usableSize-
2a950 62 72 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20  brk);.  assert( 
2a960 70 43 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d  pChild->isInit==
2a970 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
2a980 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
2a990 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b  (pChild, pPage);
2a9a0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2a9b0 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f   balancedeeper_o
2a9c0 75 74 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43 68  ut;.  memcpy(pCh
2a9d0 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67  ild->aOvfl, pPag
2a9e0 65 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d  e->aOvfl, pPage-
2a9f0 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f  >nOverflow*sizeo
2aa00 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  f(pPage->aOvfl[0
2aa10 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e  ]));.  pChild->n
2aa20 4f 76 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65  Overflow = pPage
2aa30 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69  ->nOverflow;.  i
2aa40 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  f( pChild->nOver
2aa50 66 6c 6f 77 20 29 7b 0a 20 20 20 20 70 43 68 69  flow ){.    pChi
2aa60 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20  ld->nFree = 0;. 
2aa70 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 68   }.  assert( pCh
2aa80 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67  ild->nCell==pPag
2aa90 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a 65  e->nCell );.  ze
2aaa0 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43  roPage(pPage, pC
2aab0 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26  hild->aData[0] &
2aac0 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70   ~PTF_LEAF);.  p
2aad0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
2aae0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2aaf0 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43  Offset+8], pgnoC
2ab00 68 69 6c 64 29 3b 0a 20 20 54 52 41 43 45 28 28  hild);.  TRACE((
2ab10 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72  "BALANCE: copy r
2ab20 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e  oot %d into %d\n
2ab30 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
2ab40 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
2ab50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2ab60 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2ab70 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2ab80 63 75 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20  cuum ){.    int 
2ab90 69 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  i;.    rc = ptrm
2aba0 61 70 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c  apPut(pBt, pChil
2abb0 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  d->pgno, PTRMAP_
2abc0 42 54 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67  BTREE, pPage->pg
2abd0 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
2abe0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65  ) goto balancede
2abf0 65 70 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66 6f  eper_out;.    fo
2ac00 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d  r(i=0; i<pChild-
2ac10 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
2ac20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2ac30 75 74 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20 69  utOvfl(pChild, i
2ac40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2ac50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ac60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2ac70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ac80 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d   }.#endif.  rc =
2ac90 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
2aca0 28 70 43 68 69 6c 64 29 3b 0a 0a 62 61 6c 61 6e  (pChild);..balan
2acb0 63 65 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20 20  cedeeper_out:.  
2acc0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69  releasePage(pChi
2acd0 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ld);.  return rc
2ace0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64  ;.}../*.** Decid
2acf0 65 20 69 66 20 74 68 65 20 70 61 67 65 20 70 50  e if the page pP
2ad00 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
2ad10 62 61 6c 61 6e 63 65 64 2e 20 20 49 66 20 62 61  balanced.  If ba
2ad20 6c 61 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72 65  lancing is.** re
2ad30 71 75 69 72 65 64 2c 20 63 61 6c 6c 20 74 68 65  quired, call the
2ad40 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c   appropriate bal
2ad50 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a  ancing routine..
2ad60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2ad70 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  lance(MemPage *p
2ad80 50 61 67 65 2c 20 69 6e 74 20 69 6e 73 65 72 74  Page, int insert
2ad90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2ada0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
2adb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2adc0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2add0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
2ade0 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
2adf0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2ae00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2ae10 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2ae20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2ae30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
2ae40 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
2ae50 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c  {.      rc = bal
2ae60 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61 67  ance_deeper(pPag
2ae70 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2ae80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ae90 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  && pPage->nCell=
2aea0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2aeb0 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
2aec0 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  er(pPage);.    }
2aed0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
2aee0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2aef0 6f 77 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20 20  ow>0 || .       
2af00 20 28 21 69 6e 73 65 72 74 20 26 26 20 70 50 61   (!insert && pPa
2af10 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d  ge->nFree>pPage-
2af20 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2af30 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72  *2/3) ){.      r
2af40 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  c = balance_nonr
2af50 6f 6f 74 28 70 50 61 67 65 29 3b 0a 20 20 20 20  oot(pPage);.    
2af60 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2af70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2af80 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
2af90 61 6c 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74  all cursors that
2afa0 20 70 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20   point to table 
2afb0 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20  pgnoRoot..** If 
2afc0 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72  any of those cur
2afd0 73 6f 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64  sors were opened
2afe0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
2aff0 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  in a different.*
2b000 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
2b010 63 74 69 6f 6e 20 28 61 20 64 61 74 61 62 61 73  ction (a databas
2b020 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61  e connection tha
2b030 74 20 73 68 61 72 65 73 20 74 68 65 20 70 61 67  t shares the pag
2b040 65 72 0a 2a 2a 20 63 61 63 68 65 20 77 69 74 68  er.** cache with
2b050 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
2b060 6e 65 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 61  nection) and tha
2b070 74 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  t other connecti
2b080 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e  on .** is not in
2b090 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d   the ReadUncommm
2b0a0 69 74 74 65 64 20 73 74 61 74 65 2c 20 74 68 65  itted state, the
2b0b0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
2b0c0 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
2b0d0 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20  E_LOCKED..**.** 
2b0e0 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 63  In addition to c
2b0f0 68 65 63 6b 69 6e 67 20 66 6f 72 20 72 65 61 64  hecking for read
2b100 2d 6c 6f 63 6b 73 20 28 77 68 65 72 65 20 61 20  -locks (where a 
2b110 72 65 61 64 2d 6c 6f 63 6b 20 0a 2a 2a 20 6d 65  read-lock .** me
2b120 61 6e 73 20 61 20 63 75 72 73 6f 72 20 6f 70 65  ans a cursor ope
2b130 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
2b140 3d 30 29 20 74 68 69 73 20 72 6f 75 74 69 6e 65  =0) this routine
2b150 20 61 6c 73 6f 20 6d 6f 76 65 73 0a 2a 2a 20 61   also moves.** a
2b160 6c 6c 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ll write cursors
2b170 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72   so that they ar
2b180 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  e pointing to th
2b190 65 20 0a 2a 2a 20 66 69 72 73 74 20 43 65 6c 6c  e .** first Cell
2b1a0 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67   on the root pag
2b1b0 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  e.  This is nece
2b1c0 73 73 61 72 79 20 62 65 63 61 75 73 65 20 61 6e  ssary because an
2b1d0 20 69 6e 73 65 72 74 20 0a 2a 2a 20 6f 72 20 64   insert .** or d
2b1e0 65 6c 65 74 65 20 6d 69 67 68 74 20 63 68 61 6e  elete might chan
2b1f0 67 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ge the number of
2b200 20 63 65 6c 6c 73 20 6f 6e 20 61 20 70 61 67 65   cells on a page
2b210 20 6f 72 20 64 65 6c 65 74 65 0a 2a 2a 20 61 20   or delete.** a 
2b220 70 61 67 65 20 65 6e 74 69 72 65 6c 79 20 61 6e  page entirely an
2b230 64 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74  d we do not want
2b240 20 74 6f 20 6c 65 61 76 65 20 61 6e 79 20 63 75   to leave any cu
2b250 72 73 6f 72 73 20 0a 2a 2a 20 70 6f 69 6e 74 69  rsors .** pointi
2b260 6e 67 20 74 6f 20 6e 6f 6e 2d 65 78 69 73 74 61  ng to non-exista
2b270 6e 74 20 70 61 67 65 73 20 6f 72 20 63 65 6c 6c  nt pages or cell
2b280 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2b290 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
2b2a0 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50  Btree *pBtree, P
2b2b0 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 42 74  gno pgnoRoot, Bt
2b2c0 43 75 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65  Cursor *pExclude
2b2d0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
2b2e0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2b2f0 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b  t = pBtree->pBt;
2b300 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2b310 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 61   pBtree->db;.  a
2b320 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2b330 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42  reeHoldsMutex(pB
2b340 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70  tree) );.  for(p
2b350 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
2b360 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
2b370 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63 6c 75     if( p==pExclu
2b380 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  de ) continue;. 
2b390 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65     if( p->eState
2b3a0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2b3b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2b3c0 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d  f( p->pgnoRoot!=
2b3d0 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69  pgnoRoot ) conti
2b3e0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
2b3f0 77 72 46 6c 61 67 3d 3d 30 20 29 7b 0a 20 20 20  wrFlag==0 ){.   
2b400 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 4f 74     sqlite3 *dbOt
2b410 68 65 72 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d  her = p->pBtree-
2b420 3e 64 62 3b 0a 20 20 20 20 20 20 69 66 28 20 64  >db;.      if( d
2b430 62 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a 20 20 20  bOther==0 ||.   
2b440 20 20 20 20 20 20 28 64 62 4f 74 68 65 72 21 3d        (dbOther!=
2b450 64 62 20 26 26 20 28 64 62 4f 74 68 65 72 2d 3e  db && (dbOther->
2b460 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
2b470 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d  eadUncommitted)=
2b480 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =0) ){.        r
2b490 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2b4a0 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KED;.      }.   
2b4b0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 50   }else if( p->pP
2b4c0 61 67 65 2d 3e 70 67 6e 6f 21 3d 70 2d 3e 70 67  age->pgno!=p->pg
2b4d0 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  noRoot ){.      
2b4e0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 29 3b 0a 20  moveToRoot(p);. 
2b4f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2b500 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2b510 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
2b520 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
2b530 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
2b540 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
2b550 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
2b560 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
2b570 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
2b580 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
2b590 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
2b5a0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
2b5b0 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
2b5c0 61 63 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ace = sqlite3_ma
2b5d0 6c 6c 6f 63 28 4d 58 5f 43 45 4c 4c 5f 53 49 5a  lloc(MX_CELL_SIZ
2b5e0 45 28 70 42 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  E(pBt));.  }.}..
2b5f0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
2b600 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
2b610 68 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b  he BTree.  The k
2b620 65 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28  ey is given by (
2b630 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e  pKey,nKey).** an
2b640 64 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69  d the data is gi
2b650 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44  ven by (pData,nD
2b660 61 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f  ata).  The curso
2b670 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  r is used only t
2b680 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74  o.** define what
2b690 20 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72   table the recor
2b6a0 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  d should be inse
2b6b0 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20  rted into.  The 
2b6c0 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66  cursor.** is lef
2b6d0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
2b6e0 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e  random location.
2b6f0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e  .**.** For an IN
2b700 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79  TKEY table, only
2b710 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20   the nKey value 
2b720 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73  of the key is us
2b730 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20  ed.  pKey is.** 
2b740 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20  ignored.  For a 
2b750 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20  ZERODATA table, 
2b760 74 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44  the pData and nD
2b770 61 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e  ata are both ign
2b780 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ored..*/.int sql
2b790 69 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28  ite3BtreeInsert(
2b7a0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
2b7b0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
2b7c0 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61    /* Insert data
2b7d0 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20   into the table 
2b7e0 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a  of this cursor *
2b7f0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2b800 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
2b810 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66     /* The key of
2b820 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20   the new record 
2b830 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2b840 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
2b850 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  a,  /* The data 
2b860 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
2b870 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  d */.  int nZero
2b880 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b890 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2b8a0 6f 66 20 65 78 74 72 61 20 30 20 62 79 74 65 73  of extra 0 bytes
2b8b0 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61   to append to da
2b8c0 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65  ta */.  int appe
2b8d0 6e 64 42 69 61 73 20 20 20 20 20 20 20 20 20 20  ndBias          
2b8e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2b8f0 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79  f this is likely
2b900 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b   an append */.){
2b910 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
2b920 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65   loc;.  int szNe
2b930 77 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w;.  MemPage *pP
2b940 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  age;.  Btree *p 
2b950 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
2b960 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b970 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69  = p->pBt;.  unsi
2b980 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65  gned char *oldCe
2b990 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  ll;.  unsigned c
2b9a0 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30  har *newCell = 0
2b9b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2b9c0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2b9d0 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ur) );.  if( pBt
2b9e0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  ->inTransaction!
2b9f0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2ba00 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72      /* Must star
2ba10 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
2ba20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 20  before doing an 
2ba30 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 72 63  insert */.    rc
2ba40 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
2ba50 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2ba60 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2ba70 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  R;.    return rc
2ba80 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2ba90 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2baa0 3b 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77  ;.  if( !pCur->w
2bab0 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74  rFlag ){.    ret
2bac0 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
2bad0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 6f 74     /* Cursor not
2bae0 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e   open for writin
2baf0 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63  g */.  }.  if( c
2bb00 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43  heckReadLocks(pC
2bb10 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72  ur->pBtree, pCur
2bb20 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
2bb30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2bb40 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f  SQLITE_LOCKED; /
2bb50 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72  * The table pCur
2bb60 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61   points to has a
2bb70 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
2bb80 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
2bb90 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2bba0 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
2bbb0 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
2bbc0 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20  ..  /* Save the 
2bbd0 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
2bbe0 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f   other cursors o
2bbf0 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  pen on this tabl
2bc00 65 20 2a 2f 0a 20 20 63 6c 65 61 72 43 75 72 73  e */.  clearCurs
2bc10 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2bc20 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c  ;.  if( .    SQL
2bc30 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61  ITE_OK!=(rc = sa
2bc40 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
2bc50 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2bc60 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20  , pCur)) ||.    
2bc70 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2bc80 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2bc90 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20  eto(pCur, pKey, 
2bca0 30 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42  0, nKey, appendB
2bcb0 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b  ias, &loc)).  ){
2bcc0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2bcd0 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2bce0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
2bcf0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
2bd00 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29  Key || nKey>=0 )
2bd10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2bd20 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67  e->leaf || !pPag
2bd30 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20  e->leafData );. 
2bd40 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a   TRACE(("INSERT:
2bd50 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25   table=%d nkey=%
2bd60 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67  lld ndata=%d pag
2bd70 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
2bd80 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2bd90 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74  Root, nKey, nDat
2bda0 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a  a, pPage->pgno,.
2bdb0 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30            loc==0
2bdc0 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a   ? "overwrite" :
2bdd0 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a   "new entry"));.
2bde0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2bdf0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c  >isInit );.  all
2be00 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
2be10 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d  Bt);.  newCell =
2be20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
2be30 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
2be40 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2be50 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
2be60 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
2be70 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
2be80 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
2be90 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e  ata, nZero, &szN
2bea0 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
2beb0 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2bec0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2bed0 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
2bee0 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
2bef0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2bf00 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
2bf10 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63  Bt) );.  if( loc
2bf20 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41  ==0 && CURSOR_VA
2bf30 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2bf40 65 20 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f  e ){.    u16 szO
2bf50 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ld;.    assert( 
2bf60 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
2bf70 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
2bf80 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
2bf90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2bfa0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2bfb0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2bfc0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
2bfd0 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d  nd_insert;.    }
2bfe0 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66  .    oldCell = f
2bff0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
2c000 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 20 20 69  Cur->idx);.    i
2c010 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2c020 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
2c030 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c  newCell, oldCell
2c040 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 4);.    }.    
2c050 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65  szOld = cellSize
2c060 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65  Ptr(pPage, oldCe
2c070 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c  ll);.    rc = cl
2c080 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f  earCell(pPage, o
2c090 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28  ldCell);.    if(
2c0a0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69   rc ) goto end_i
2c0b0 6e 73 65 72 74 3b 0a 20 20 20 20 64 72 6f 70 43  nsert;.    dropC
2c0c0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2c0d0 3e 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20  >idx, szOld);.  
2c0e0 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20  }else if( loc<0 
2c0f0 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  && pPage->nCell>
2c100 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
2c110 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
2c120 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b      pCur->idx++;
2c130 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
2c140 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
2c150 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
2c160 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2c170 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2c180 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63  leaf );.  }.  rc
2c190 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
2c1a0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2c1b0 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20  newCell, szNew, 
2c1c0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
2c1d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2c1e0 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
2c1f0 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
2c200 67 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71 6c  ge, 1);.  /* sql
2c210 69 74 65 33 42 74 72 65 65 50 61 67 65 44 75 6d  ite3BtreePageDum
2c220 70 28 70 43 75 72 2d 3e 70 42 74 2c 20 70 43 75  p(pCur->pBt, pCu
2c230 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  r->pgnoRoot, 1);
2c240 20 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68 28   */.  /* fflush(
2c250 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69 66  stdout); */.  if
2c260 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c270 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
2c280 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64  t(pCur);.  }.end
2c290 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72  _insert:.  retur
2c2a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
2c2b0 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79 20  elete the entry 
2c2c0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
2c2d0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
2c2e0 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
2c2f0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2c300 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61  at a random loca
2c310 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
2c320 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
2c330 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2c340 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2c350 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2c360 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2c370 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72   *pCell;.  int r
2c380 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  c;.  Pgno pgnoCh
2c390 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74 72 65 65  ild = 0;.  Btree
2c3a0 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
2c3b0 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
2c3c0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
2c3d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2c3e0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2c3f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2c400 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2c410 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
2c420 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52  action!=TRANS_WR
2c430 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75  ITE ){.    /* Mu
2c440 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
2c450 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f  action before do
2c460 69 6e 67 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a  ing a delete */.
2c470 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
2c480 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2c490 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2c4a0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74  E_ERROR;.    ret
2c4b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2c4c0 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
2c4d0 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 70 43  Only );.  if( pC
2c4e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2c4f0 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
2c500 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
2c510 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  p;.  }.  if( pCu
2c520 72 2d 3e 69 64 78 20 3e 3d 20 70 50 61 67 65 2d  r->idx >= pPage-
2c530 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65  >nCell ){.    re
2c540 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2c550 52 3b 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  R;  /* The curso
2c560 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
2c570 67 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f  g to anything */
2c580 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 43 75 72  .  }.  if( !pCur
2c590 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ->wrFlag ){.    
2c5a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
2c5b0 52 4d 3b 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74  RM;   /* Did not
2c5c0 20 6f 70 65 6e 20 74 68 69 73 20 63 75 72 73 6f   open this curso
2c5d0 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f  r for writing */
2c5e0 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b  .  }.  if( check
2c5f0 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e  ReadLocks(pCur->
2c600 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67  pBtree, pCur->pg
2c610 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 20 29 7b  noRoot, pCur) ){
2c620 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2c630 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68  TE_LOCKED; /* Th
2c640 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69  e table pCur poi
2c650 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61  nts to has a rea
2c660 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20  d lock */.  }.. 
2c670 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20   /* Restore the 
2c680 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
2c690 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70  osition (a no-op
2c6a0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2c6b0 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43  s not in .  ** C
2c6c0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2c6d0 4b 20 73 74 61 74 65 29 20 61 6e 64 20 73 61 76  K state) and sav
2c6e0 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
2c6f0 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72  of any other cur
2c700 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20  sors .  ** open 
2c710 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
2c720 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c  e. Then call sql
2c730 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2c740 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a   on the page.  *
2c750 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79  * that the entry
2c760 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
2c770 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66   from..  */.  if
2c780 28 20 0a 20 20 20 20 28 72 63 20 3d 20 72 65 73  ( .    (rc = res
2c790 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
2c7a0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 29  rPosition(pCur))
2c7b0 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d  !=0 ||.    (rc =
2c7c0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
2c7d0 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
2c7e0 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30 20 7c  oot, pCur))!=0 |
2c7f0 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69  |.    (rc = sqli
2c800 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2c810 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d  age->pDbPage))!=
2c820 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  0.  ){.    retur
2c830 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
2c840 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 20  Locate the cell 
2c850 77 69 74 68 69 6e 20 69 74 73 20 70 61 67 65 20  within its page 
2c860 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c 6c 20  and leave pCell 
2c870 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a  pointing to the.
2c880 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65 20 63    ** data. The c
2c890 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c 20  learCell() call 
2c8a0 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72 66 6c  frees any overfl
2c8b0 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
2c8c0 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a  ted with the.  *
2c8d0 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c 6c  * cell. The cell
2c8e0 20 69 74 73 65 6c 66 20 69 73 20 73 74 69 6c 6c   itself is still
2c8f0 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20 20   intact..  */.  
2c900 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2c910 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2c920 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  x);.  if( !pPage
2c930 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
2c940 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
2c950 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20  te(pCell);.  }. 
2c960 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
2c970 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
2c980 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
2c990 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2c9a0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2c9b0 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  f ){.    /*.    
2c9c0 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65 20  ** The entry we 
2c9d0 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c  are about to del
2c9e0 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  ete is not a lea
2c9f0 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f  f so if we do no
2ca00 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65  t.    ** do some
2ca10 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65  thing we will le
2ca20 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e  ave a hole on an
2ca30 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a   internal page..
2ca40 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74      ** We have t
2ca50 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20  o fill the hole 
2ca60 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63  by moving in a c
2ca70 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e  ell from a leaf.
2ca80 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78    The.    ** nex
2ca90 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65  t Cell after the
2caa0 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74   one to be delet
2cab0 65 64 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ed is guaranteed
2cac0 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20   to exist and.  
2cad0 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61    ** to be a lea
2cae0 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20  f so we can use 
2caf0 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42  it..    */.    B
2cb00 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b  tCursor leafCur;
2cb10 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
2cb20 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69  ar *pNext;.    i
2cb30 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  nt notUsed;.    
2cb40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
2cb50 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20  empCell = 0;.   
2cb60 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 2d   assert( !pPage-
2cb70 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 20  >leafData );.   
2cb80 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2cb90 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c  TempCursor(pCur,
2cba0 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20   &leafCur);.    
2cbb0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2cbc0 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20  eNext(&leafCur, 
2cbd0 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69  &notUsed);.    i
2cbe0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cbf0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2cc00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2cc10 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e  (leafCur.pPage->
2cc20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
2cc30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2cc40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
2cc50 31 36 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20 20  16 szNext;.     
2cc60 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a   TRACE(("DELETE:
2cc70 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65   table=%d delete
2cc80 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25   internal from %
2cc90 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c  d replace from l
2cca0 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  eaf %d\n",.     
2ccb0 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f      pCur->pgnoRo
2ccc0 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  ot, pPage->pgno,
2ccd0 20 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e   leafCur.pPage->
2cce0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64 72  pgno));.      dr
2ccf0 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  opCell(pPage, pC
2cd00 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a  ur->idx, cellSiz
2cd10 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
2cd20 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74  l));.      pNext
2cd30 20 3d 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61 66   = findCell(leaf
2cd40 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43  Cur.pPage, leafC
2cd50 75 72 2e 69 64 78 29 3b 0a 20 20 20 20 20 20 73  ur.idx);.      s
2cd60 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65  zNext = cellSize
2cd70 50 74 72 28 6c 65 61 66 43 75 72 2e 70 50 61 67  Ptr(leafCur.pPag
2cd80 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20  e, pNext);.     
2cd90 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c   assert( MX_CELL
2cda0 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65  _SIZE(pBt)>=szNe
2cdb0 78 74 2b 34 20 29 3b 0a 20 20 20 20 20 20 61 6c  xt+4 );.      al
2cdc0 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
2cdd0 70 42 74 29 3b 0a 20 20 20 20 20 20 74 65 6d 70  pBt);.      temp
2cde0 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70  Cell = pBt->pTmp
2cdf0 53 70 61 63 65 3b 0a 20 20 20 20 20 20 69 66 28  Space;.      if(
2ce00 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a   tempCell==0 ){.
2ce10 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2ce20 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2ce30 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
2ce40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ce50 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72        rc = inser
2ce60 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  tCell(pPage, pCu
2ce70 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c  r->idx, pNext-4,
2ce80 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43   szNext+4, tempC
2ce90 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ell, 0);.      }
2cea0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2ceb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cec0 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
2ced0 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
2cee0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 2c  age, pCur->idx),
2cef0 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20   pgnoChild);.   
2cf00 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2cf10 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  e(pPage, 0);.   
2cf20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2cf30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2cf40 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c          dropCell
2cf50 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20  (leafCur.pPage, 
2cf60 6c 65 61 66 43 75 72 2e 69 64 78 2c 20 73 7a 4e  leafCur.idx, szN
2cf70 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ext);.        rc
2cf80 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61 66 43   = balance(leafC
2cf90 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ur.pPage, 0);.  
2cfa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2cfb0 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65  sqlite3BtreeRele
2cfc0 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c  aseTempCursor(&l
2cfd0 65 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  eafCur);.  }else
2cfe0 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 44 45  {.    TRACE(("DE
2cff0 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64  LETE: table=%d d
2d000 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20  elete from leaf 
2d010 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43  %d\n",.       pC
2d020 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50  ur->pgnoRoot, pP
2d030 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  age->pgno));.   
2d040 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
2d050 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c   pCur->idx, cell
2d060 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
2d070 43 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20 3d  Cell));.    rc =
2d080 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20   balance(pPage, 
2d090 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
2d0a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2d0b0 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43     moveToRoot(pC
2d0c0 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ur);.  }.  retur
2d0d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
2d0e0 72 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65  reate a new BTre
2d0f0 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20  e table.  Write 
2d100 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68  into *piTable th
2d110 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72  e page.** number
2d120 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61   for the root pa
2d130 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  ge of the new ta
2d140 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ble..**.** The t
2d150 79 70 65 20 6f 66 20 74 79 70 65 20 69 73 20 64  ype of type is d
2d160 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
2d170 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
2d180 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  .  Only the.** f
2d190 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20  ollowing values 
2d1a0 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63 75 72  of flags are cur
2d1b0 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20  rently in use.  
2d1c0 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72  Other values for
2d1d0 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20  .** flags might 
2d1e0 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20  not work:.**.** 
2d1f0 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59      BTREE_INTKEY
2d200 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20  |BTREE_LEAFDATA 
2d210 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
2d220 20 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77   tables with row
2d230 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42  id keys.**     B
2d240 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20  TREE_ZERODATA   
2d250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55                 U
2d260 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69  sed for SQL indi
2d270 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ces.*/.static in
2d280 74 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62  t btreeCreateTab
2d290 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
2d2a0 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66   *piTable, int f
2d2b0 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65  lags){.  BtShare
2d2c0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2d2d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
2d2e0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f  t;.  Pgno pgnoRo
2d2f0 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ot;.  int rc;.. 
2d300 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2d310 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2d320 70 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  p) );.  if( pBt-
2d330 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
2d340 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2d350 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
2d360 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66   a transaction f
2d370 69 72 73 74 20 2a 2f 0a 20 20 20 20 72 63 20 3d  irst */.    rc =
2d380 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2d390 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2d3a0 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2d3b0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2d3c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
2d3d0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
2d3e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
2d3f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2d400 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2d410 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52  reePage(pBt, &pR
2d420 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20  oot, &pgnoRoot, 
2d430 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  1, 0);.  if( rc 
2d440 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2d450 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66  ;.  }.#else.  if
2d460 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2d470 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
2d480 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20  noMove;      /* 
2d490 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65 72 65  Move a page here
2d4a0 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f   to make room fo
2d4b0 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  r the root-page 
2d4c0 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
2d4d0 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68  pPageMove; /* Th
2d4e0 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  e page to move t
2d4f0 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72  o. */..    /* Cr
2d500 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  eating a new tab
2d510 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20  le may probably 
2d520 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
2d530 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  n existing datab
2d540 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61  ase.    ** to ma
2d550 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20  ke room for the 
2d560 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20  new tables root 
2d570 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68  page. In case th
2d580 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20  is page turns.  
2d590 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61    ** out to be a
2d5a0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
2d5b0 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72   delete all over
2d5c0 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61  flow page-map ca
2d5d0 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64  ches.    ** held
2d5e0 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73   by open cursors
2d5f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76  ..    */.    inv
2d600 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
2d610 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20  owCache(pBt);.. 
2d620 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76     /* Read the v
2d630 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20  alue of meta[3] 
2d640 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2d650 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  e to determine w
2d660 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  here the.    ** 
2d670 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
2d680 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c   new table shoul
2d690 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73  d go. meta[3] is
2d6a0 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
2d6b0 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72  t-page.    ** cr
2d6c0 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f  eated so far, so
2d6d0 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   the new root-pa
2d6e0 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31  ge is (meta[3]+1
2d6f0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
2d700 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
2d710 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 70 67  etMeta(p, 4, &pg
2d720 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28  noRoot);.    if(
2d730 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d740 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2d750 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 67 6e  c;.    }.    pgn
2d760 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  oRoot++;..    /*
2d770 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   The new root-pa
2d780 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c  ge may not be al
2d790 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69  located on a poi
2d7a0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f  nter-map page, o
2d7b0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e  r the.    ** PEN
2d7c0 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a  DING_BYTE page..
2d7d0 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
2d7e0 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d  ( pgnoRoot==PTRM
2d7f0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70  AP_PAGENO(pBt, p
2d800 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20  gnoRoot) ||.    
2d810 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45      pgnoRoot==PE
2d820 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2d830 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67  pBt) ){.      pg
2d840 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a  noRoot++;.    }.
2d850 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
2d860 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20  Root>=3 );..    
2d870 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61  /* Allocate a pa
2d880 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68 61  ge. The page tha
2d890 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69  t currently resi
2d8a0 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  des at pgnoRoot 
2d8b0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d  will.    ** be m
2d8c0 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f  oved to the allo
2d8d0 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65  cated page (unle
2d8e0 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  ss the allocated
2d8f0 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20   page happens.  
2d900 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61    ** to reside a
2d910 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20  t pgnoRoot)..   
2d920 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   */.    rc = all
2d930 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2d940 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20  Bt, &pPageMove, 
2d950 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52  &pgnoMove, pgnoR
2d960 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  oot, 1);.    if(
2d970 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d980 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2d990 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
2d9a0 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f  ( pgnoMove!=pgno
2d9b0 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Root ){.      /*
2d9c0 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65   pgnoRoot is the
2d9d0 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20   page that will 
2d9e0 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
2d9f0 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20 20  root-page of.   
2da00 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 61     ** the new ta
2da10 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61 6e  ble (assuming an
2da20 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f   error did not o
2da30 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77 65  ccur). But we we
2da40 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  re.      ** allo
2da50 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20  cated pgnoMove. 
2da60 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e 65  If required (i.e
2da70 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  . if it was not 
2da80 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
2da90 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67 20  ** by extending 
2daa0 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20 63  the file), the c
2dab0 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20 70  urrent page at p
2dac0 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65  osition pgnoMove
2dad0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72  .      ** is alr
2dae0 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a  eady journaled..
2daf0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75        */.      u
2db00 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50  8 eType;.      P
2db10 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
2db20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2db30 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20  (pPageMove);..  
2db40 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20      /* Move the 
2db50 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 61  page currently a
2db60 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67  t pgnoRoot to pg
2db70 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20  noMove. */.     
2db80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2db90 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
2dba0 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c  gnoRoot, &pRoot,
2dbb0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
2dbc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2dbd0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2dbe0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2dbf0 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
2dc00 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26  pBt, pgnoRoot, &
2dc10 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
2dc20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2dc30 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65 54  =SQLITE_OK || eT
2dc40 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
2dc50 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  PAGE || eType==P
2dc60 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
2dc70 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2dc80 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
2dc90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2dca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2dcb0 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54  ssert( eType!=PT
2dcc0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
2dcd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
2dce0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52 45  Type!=PTRMAP_FRE
2dcf0 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 72  EPAGE );.      r
2dd00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2dd10 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62  Write(pRoot->pDb
2dd20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
2dd30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2dd40 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2dd50 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20  ePage(pRoot);.  
2dd60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2dd70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2dd80 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
2dd90 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79  (pBt, pRoot, eTy
2dda0 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70 67  pe, iPtrPage, pg
2ddb0 6e 6f 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 72  noMove);.      r
2ddc0 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
2ddd0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74  );..      /* Obt
2dde0 61 69 6e 20 74 68 65 20 70 61 67 65 20 61 74 20  ain the page at 
2ddf0 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20  pgnoRoot */.    
2de00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2de10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2de20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2de30 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
2de40 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
2de50 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2de60 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
2de70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2de80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2de90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2dea0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
2deb0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2dec0 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
2ded0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2dee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2def0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2df00 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
2df10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2df20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2df30 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67 65     pRoot = pPage
2df40 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20  Move;.    } ..  
2df50 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
2df60 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20  pointer-map and 
2df70 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68 20 74  meta-data with t
2df80 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
2df90 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20   number. */.    
2dfa0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
2dfb0 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54  Bt, pgnoRoot, PT
2dfc0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
2dfd0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2dfe0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2dff0 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
2e000 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e010 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
2e020 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
2e030 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74  a(p, 4, pgnoRoot
2e040 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2e050 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2e060 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20  ge(pRoot);.     
2e070 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e080 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
2e090 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2e0a0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f  eePage(pBt, &pRo
2e0b0 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31  ot, &pgnoRoot, 1
2e0c0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
2e0d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2e0e0 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  }.#endif.  asser
2e0f0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2e100 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74  swriteable(pRoot
2e110 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2e120 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20  zeroPage(pRoot, 
2e130 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45 41 46  flags | PTF_LEAF
2e140 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
2e150 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70 44  rUnref(pRoot->pD
2e160 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54 61 62  bPage);.  *piTab
2e170 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f  le = (int)pgnoRo
2e180 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ot;.  return SQL
2e190 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
2e1a0 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
2e1b0 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
2e1c0 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e  int *piTable, in
2e1d0 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
2e1e0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
2e1f0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
2e200 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62  >pBt->db = p->db
2e210 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 72  ;.  rc = btreeCr
2e220 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69 54  eateTable(p, piT
2e230 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  able, flags);.  
2e240 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
2e250 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
2e260 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  c;.}../*.** Eras
2e270 65 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61  e the given data
2e280 62 61 73 65 20 70 61 67 65 20 61 6e 64 20 61 6c  base page and al
2e290 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e 20  l its children. 
2e2a0 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70   Return.** the p
2e2b0 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  age to the freel
2e2c0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
2e2d0 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61 73 65  nt clearDatabase
2e2e0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
2e2f0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
2e300 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74 68   /* The BTree th
2e310 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
2e320 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  table */.  Pgno 
2e330 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
2e340 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2e350 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 4d 65  to clear */.  Me
2e360 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
2e370 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61      /* Parent pa
2e380 67 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 74 68  ge.  NULL for th
2e390 65 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e 74 20  e root */.  int 
2e3a0 66 72 65 65 50 61 67 65 46 6c 61 67 20 20 20 20  freePageFlag    
2e3b0 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20    /* Deallocate 
2e3c0 70 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f 0a  page if true */.
2e3d0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
2e3e0 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
2e3f0 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
2e400 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74  ar *pCell;.  int
2e410 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   i;..  assert( s
2e420 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2e430 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
2e440 0a 20 20 69 66 28 20 70 67 6e 6f 3e 73 71 6c 69  .  if( pgno>sqli
2e450 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
2e460 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
2e470 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2e480 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2e490 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65  ;.  }..  rc = ge
2e4a0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
2e4b0 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 2c 20  , pgno, &pPage, 
2e4c0 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20  pParent);.  if( 
2e4d0 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
2e4e0 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
2e4f0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
2e500 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
2e510 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  {.    pCell = fi
2e520 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
2e530 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
2e540 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2e550 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
2e560 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  sePage(pBt, get4
2e570 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61  byte(pCell), pPa
2e580 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b  ge->pParent, 1);
2e590 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2e5a0 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
2e5b0 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  sepage_out;.    
2e5c0 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  }.    rc = clear
2e5d0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
2e5e0 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
2e5f0 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
2e600 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  asepage_out;.  }
2e610 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
2e620 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  eaf ){.    rc = 
2e630 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
2e640 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
2e650 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d  &pPage->aData[8]
2e660 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  ), pPage->pParen
2e670 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 1);.    if( r
2e680 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
2e690 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
2e6a0 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65 50 61    }.  if( freePa
2e6b0 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  geFlag ){.    rc
2e6c0 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67   = freePage(pPag
2e6d0 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  e);.  }else if( 
2e6e0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
2e6f0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2e700 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b 0a 20  DbPage))==0 ){. 
2e710 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
2e720 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e, pPage->aData[
2e730 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a  0] | PTF_LEAF);.
2e740 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61 62 61    }..cleardataba
2e750 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 72 65  sepage_out:.  re
2e760 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
2e770 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2e780 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
2e790 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ll information f
2e7a0 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74 61 62  rom a single tab
2e7b0 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
2e7c0 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73 0a 2a  se.  iTable is.*
2e7d0 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
2e7e0 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 6f 66  r of the root of
2e7f0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41 66 74   the table.  Aft
2e800 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
2e810 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68 65 20  returns,.** the 
2e820 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70  root page is emp
2e830 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20 65 78  ty, but still ex
2e840 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ists..**.** This
2e850 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61   routine will fa
2e860 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c  il with SQLITE_L
2e870 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65 20 61  OCKED if there a
2e880 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72  re any open.** r
2e890 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ead cursors on t
2e8a0 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65 6e 20  he table.  Open 
2e8b0 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
2e8c0 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a  e moved to the.*
2e8d0 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  * root of the ta
2e8e0 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
2e8f0 74 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62  te3BtreeClearTab
2e900 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
2e910 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20   iTable){.  int 
2e920 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
2e930 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
2e940 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
2e950 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
2e960 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  = p->db;.  if( p
2e970 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
2e980 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 63  _WRITE ){.    rc
2e990 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   = pBt->readOnly
2e9a0 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   ? SQLITE_READON
2e9b0 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f  LY : SQLITE_ERRO
2e9c0 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  R;.  }else if( (
2e9d0 72 63 20 3d 20 63 68 65 63 6b 52 65 61 64 4c 6f  rc = checkReadLo
2e9e0 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30  cks(p, iTable, 0
2e9f0 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
2ea00 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20  .    /* nothing 
2ea10 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65  to do */.  }else
2ea20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
2ea30 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
2ea40 73 6f 72 73 28 70 42 74 2c 20 69 54 61 62 6c 65  sors(pBt, iTable
2ea50 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20  , 0)) ){.    /* 
2ea60 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f  nothing to do */
2ea70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2ea80 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
2ea90 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29  Page(pBt, (Pgno)
2eaa0 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 20  iTable, 0, 0);. 
2eab0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
2eac0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
2ead0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2eae0 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72   Erase all infor
2eaf0 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c  mation in a tabl
2eb00 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 6f  e and add the ro
2eb10 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ot of the table 
2eb20 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c 69  to.** the freeli
2eb30 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65  st.  Except, the
2eb40 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70 72 69   root of the pri
2eb50 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28 74 68  nciple table (th
2eb60 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65  e one on.** page
2eb70 20 31 29 20 69 73 20 6e 65 76 65 72 20 61 64 64   1) is never add
2eb80 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
2eb90 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  st..**.** This r
2eba0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c  outine will fail
2ebb0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43   with SQLITE_LOC
2ebc0 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72 65  KED if there are
2ebd0 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72   any open.** cur
2ebe0 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  sors on the tabl
2ebf0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f  e..**.** If AUTO
2ec00 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65  VACUUM is enable
2ec10 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 61  d and the page a
2ec20 74 20 69 54 61 62 6c 65 20 69 73 20 6e 6f 74 20  t iTable is not 
2ec30 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74  the last.** root
2ec40 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2ec50 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
2ec60 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   the last root p
2ec70 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64  age .** in the d
2ec80 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2ec90 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20 73  moved into the s
2eca0 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63  lot formerly occ
2ecb0 75 70 69 65 64 20 62 79 0a 2a 2a 20 69 54 61 62  upied by.** iTab
2ecc0 6c 65 20 61 6e 64 20 74 68 61 74 20 6c 61 73 74  le and that last
2ecd0 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f   slot formerly o
2ece0 63 63 75 70 69 65 64 20 62 79 20 74 68 65 20 6c  ccupied by the l
2ecf0 61 73 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  ast root page.**
2ed00 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
2ed10 20 66 72 65 65 6c 69 73 74 20 69 6e 73 74 65 61   freelist instea
2ed20 64 20 6f 66 20 69 54 61 62 6c 65 2e 20 20 49 6e  d of iTable.  In
2ed30 20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a   this say, all.*
2ed40 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 61 72 65  * root pages are
2ed50 20 6b 65 70 74 20 61 74 20 74 68 65 20 62 65 67   kept at the beg
2ed60 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
2ed70 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
2ed80 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73 61  ch.** is necessa
2ed90 72 79 20 66 6f 72 20 41 55 54 4f 56 41 43 55 55  ry for AUTOVACUU
2eda0 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e  M to work right.
2edb0 20 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65    *piMoved is se
2edc0 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67  t to the .** pag
2edd0 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 75 73  e number that us
2ede0 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73  ed to be the las
2edf0 74 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74  t root page in t
2ee00 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a  he file before.*
2ee10 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49 66 20  * the move.  If 
2ee20 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d 6f 76  no page gets mov
2ee30 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73 20  ed, *piMoved is 
2ee40 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65  set to 0..** The
2ee50 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20   last root page 
2ee60 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20 6d  is recorded in m
2ee70 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65 20 76  eta[3] and the v
2ee80 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b  alue of.** meta[
2ee90 33 5d 20 69 73 20 75 70 64 61 74 65 64 20 62 79  3] is updated by
2eea0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e   this procedure.
2eeb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2eec0 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74  treeDropTable(Bt
2eed0 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
2eee0 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64  le, int *piMoved
2eef0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
2ef00 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2ef10 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  0;.  BtShared *p
2ef20 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
2ef30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2ef40 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2ef50 29 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  ) );.  if( p->in
2ef60 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49  Trans!=TRANS_WRI
2ef70 54 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  TE ){.    return
2ef80 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2ef90 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2efa0 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2efb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73  .  }..  /* It is
2efc0 20 69 6c 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70   illegal to drop
2efd0 20 61 20 74 61 62 6c 65 20 69 66 20 61 6e 79 20   a table if any 
2efe0 63 75 72 73 6f 72 73 20 61 72 65 20 6f 70 65 6e  cursors are open
2eff0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
2f000 61 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 62  abase. This is b
2f010 65 63 61 75 73 65 20 69 6e 20 61 75 74 6f 2d 76  ecause in auto-v
2f020 61 63 75 75 6d 20 6d 6f 64 65 20 74 68 65 20 62  acuum mode the b
2f030 61 63 6b 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20  ackend may.  ** 
2f040 6e 65 65 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f  need to move ano
2f050 74 68 65 72 20 72 6f 6f 74 2d 70 61 67 65 20 74  ther root-page t
2f060 6f 20 66 69 6c 6c 20 61 20 67 61 70 20 6c 65 66  o fill a gap lef
2f070 74 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64  t by the deleted
2f080 0a 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e  .  ** root page.
2f090 20 49 66 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   If an open curs
2f0a0 6f 72 20 77 61 73 20 75 73 69 6e 67 20 74 68 69  or was using thi
2f0b0 73 20 70 61 67 65 20 61 20 70 72 6f 62 6c 65 6d  s page a problem
2f0c0 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63   would .  ** occ
2f0d0 75 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ur..  */.  if( p
2f0e0 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  Bt->pCursor ){. 
2f0f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f100 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20  _LOCKED;.  }..  
2f110 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2f120 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 28 50  eGetPage(pBt, (P
2f130 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61  gno)iTable, &pPa
2f140 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  ge, 0);.  if( rc
2f150 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2f160 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2f170 65 43 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69  eClearTable(p, i
2f180 54 61 62 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  Table);.  if( rc
2f190 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
2f1a0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2f1b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2f1c0 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a    *piMoved = 0;.
2f1d0 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e 31 20  .  if( iTable>1 
2f1e0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
2f1f0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2f200 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
2f210 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
2f220 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
2f230 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28  );.#else.    if(
2f240 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2f250 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d   ){.      Pgno m
2f260 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20  axRootPgno;.    
2f270 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2f280 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34 2c  reeGetMeta(p, 4,
2f290 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a   &maxRootPgno);.
2f2a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2f2b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f2c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2f2d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
2f2e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2f2f0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 54 61  }..      if( iTa
2f300 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f  ble==maxRootPgno
2f310 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
2f320 66 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  f the table bein
2f330 67 20 64 72 6f 70 70 65 64 20 69 73 20 74 68 65  g dropped is the
2f340 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
2f350 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
2f360 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
2f370 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  ber in the datab
2f380 61 73 65 2c 20 70 75 74 20 74 68 65 20 72 6f 6f  ase, put the roo
2f390 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72  t page on the fr
2f3a0 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20  ee list. .      
2f3b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
2f3c0 3d 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65  = freePage(pPage
2f3d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
2f3e0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2f3f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2f400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f410 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2f420 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f430 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f440 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
2f450 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65 73 20  ng dropped does 
2f460 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c 61 72  not have the lar
2f470 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
2f480 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
2f490 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2f4a0 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20 70 61  . So move the pa
2f4b0 67 65 20 74 68 61 74 20 64 6f 65 73 20 69 6e 74  ge that does int
2f4c0 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  o the .        *
2f4d0 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20 74 68  * gap left by th
2f4e0 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70  e deleted root-p
2f4f0 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  age..        */.
2f500 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
2f510 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20 20 20  *pMove;.        
2f520 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2f530 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  e);.        rc =
2f540 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2f550 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f  Page(pBt, maxRoo
2f560 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30  tPgno, &pMove, 0
2f570 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2f580 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f590 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2f5a0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2f5b0 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
2f5c0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4d  catePage(pBt, pM
2f5d0 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  ove, PTRMAP_ROOT
2f5e0 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c 65 29  PAGE, 0, iTable)
2f5f0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2f600 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20  ePage(pMove);.  
2f610 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2f620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f630 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2f640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f650 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2f660 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2f670 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d  maxRootPgno, &pM
2f680 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ove, 0);.       
2f690 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2f6a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2f6b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2f6c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
2f6d0 3d 20 66 72 65 65 50 61 67 65 28 70 4d 6f 76 65  = freePage(pMove
2f6e0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
2f6f0 73 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20  sePage(pMove);. 
2f700 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2f710 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f720 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2f730 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f740 20 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61     *piMoved = ma
2f750 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20  xRootPgno;.     
2f760 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   }..      /* Set
2f770 20 74 68 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f   the new 'max-ro
2f780 6f 74 2d 70 61 67 65 27 20 76 61 6c 75 65 20 69  ot-page' value i
2f790 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
2f7a0 65 61 64 65 72 2e 20 54 68 69 73 0a 20 20 20 20  eader. This.    
2f7b0 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 6c 64 20    ** is the old 
2f7c0 76 61 6c 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20  value less one, 
2f7d0 6c 65 73 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66  less one more if
2f7e0 20 74 68 61 74 20 68 61 70 70 65 6e 73 20 74 6f   that happens to
2f7f0 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 61 20 72  .      ** be a r
2f800 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c  oot-page number,
2f810 20 6c 65 73 73 20 6f 6e 65 20 61 67 61 69 6e 20   less one again 
2f820 69 66 20 74 68 61 74 20 69 73 20 74 68 65 0a 20  if that is the. 
2f830 20 20 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f       ** PENDING_
2f840 42 59 54 45 5f 50 41 47 45 2e 0a 20 20 20 20 20  BYTE_PAGE..     
2f850 20 2a 2f 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f   */.      maxRoo
2f860 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69  tPgno--;.      i
2f870 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d  f( maxRootPgno==
2f880 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2f890 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
2f8a0 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
2f8b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f8c0 66 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d  f( maxRootPgno==
2f8d0 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
2f8e0 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20  t, maxRootPgno) 
2f8f0 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f  ){.        maxRo
2f900 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
2f910 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2f920 6d 61 78 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e  maxRootPgno!=PEN
2f930 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2f940 42 74 29 20 29 3b 0a 0a 20 20 20 20 20 20 72 63  Bt) );..      rc
2f950 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
2f960 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
2f970 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20  maxRootPgno);.  
2f980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2f990 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
2f9a0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  ge);.      relea
2f9b0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2f9c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65     }.#endif.  }e
2f9d0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73  lse{.    /* If s
2f9e0 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
2f9f0 61 62 6c 65 20 77 61 73 20 63 61 6c 6c 65 64 20  able was called 
2fa00 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20  on page 1. */.  
2fa10 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65    zeroPage(pPage
2fa20 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
2fa30 5f 4c 45 41 46 20 29 3b 0a 20 20 20 20 72 65 6c  _LEAF );.    rel
2fa40 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2fa50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2fa60 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ;  .}.int sqlite
2fa70 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
2fa80 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54  Btree *p, int iT
2fa90 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76  able, int *piMov
2faa0 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ed){.  int rc;. 
2fab0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
2fac0 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
2fad0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72  >db = p->db;.  r
2fae0 63 20 3d 20 62 74 72 65 65 44 72 6f 70 54 61 62  c = btreeDropTab
2faf0 6c 65 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 69  le(p, iTable, pi
2fb00 4d 6f 76 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  Moved);.  sqlite
2fb10 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
2fb20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2fb30 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
2fb40 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta-information
2fb50 20 6f 75 74 20 6f 66 20 61 20 64 61 74 61 62 61   out of a databa
2fb60 73 65 20 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30  se file.  Meta[0
2fb70 5d 0a 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62  ].** is the numb
2fb80 65 72 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  er of free pages
2fb90 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
2fba0 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74  e database.  Met
2fbb0 61 5b 31 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20  a[1].** through 
2fbc0 6d 65 74 61 5b 31 35 5d 20 61 72 65 20 61 76 61  meta[15] are ava
2fbd0 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 62  ilable for use b
2fbe0 79 20 68 69 67 68 65 72 20 6c 61 79 65 72 73 2e  y higher layers.
2fbf0 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20    Meta[0].** is 
2fc00 72 65 61 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f  read-only, the o
2fc10 74 68 65 72 73 20 61 72 65 20 72 65 61 64 2f 77  thers are read/w
2fc20 72 69 74 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65  rite..** .** The
2fc30 20 73 63 68 65 6d 61 20 6c 61 79 65 72 20 6e 75   schema layer nu
2fc40 6d 62 65 72 73 20 6d 65 74 61 20 76 61 6c 75 65  mbers meta value
2fc50 73 20 64 69 66 66 65 72 65 6e 74 6c 79 2e 20 20  s differently.  
2fc60 41 74 20 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a  At the schema.**
2fc70 20 6c 61 79 65 72 20 28 61 6e 64 20 74 68 65 20   layer (and the 
2fc80 53 65 74 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65  SetCookie and Re
2fc90 61 64 43 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73  adCookie opcodes
2fca0 29 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  ) the number of.
2fcb0 2a 2a 20 66 72 65 65 20 70 61 67 65 73 20 69 73  ** free pages is
2fcc0 20 6e 6f 74 20 76 69 73 69 62 6c 65 2e 20 20 53   not visible.  S
2fcd0 6f 20 43 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74  o Cookie[0] is t
2fce0 68 65 20 73 61 6d 65 20 61 73 20 4d 65 74 61 5b  he same as Meta[
2fcf0 31 5d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  1]..*/.int sqlit
2fd00 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 42  e3BtreeGetMeta(B
2fd10 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78  tree *p, int idx
2fd20 2c 20 75 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20  , u32 *pMeta){. 
2fd30 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
2fd40 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  ;.  int rc;.  un
2fd50 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31  signed char *pP1
2fd60 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2fd70 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
2fd80 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
2fd90 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
2fda0 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65   p->db;..  /* Re
2fdb0 61 64 69 6e 67 20 61 20 6d 65 74 61 2d 64 61 74  ading a meta-dat
2fdc0 61 20 76 61 6c 75 65 20 72 65 71 75 69 72 65 73  a value requires
2fdd0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
2fde0 70 61 67 65 20 31 20 28 61 6e 64 20 68 65 6e 63  page 1 (and henc
2fdf0 65 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  e.  ** the sqlit
2fe00 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
2fe10 57 65 20 67 72 61 62 20 74 68 69 73 20 6c 6f 63  We grab this loc
2fe20 6b 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  k regardless of 
2fe30 77 68 65 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20  whether or.  ** 
2fe40 6e 6f 74 20 74 68 65 20 53 51 4c 49 54 45 5f 52  not the SQLITE_R
2fe50 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66  eadUncommitted f
2fe60 6c 61 67 20 69 73 20 73 65 74 20 28 74 68 65 20  lag is set (the 
2fe70 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20  table rooted at 
2fe80 70 61 67 65 0a 20 20 2a 2a 20 31 20 69 73 20 74  page.  ** 1 is t
2fe90 72 65 61 74 65 64 20 61 73 20 61 20 73 70 65 63  reated as a spec
2fea0 69 61 6c 20 63 61 73 65 20 62 79 20 71 75 65 72  ial case by quer
2feb0 79 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64  yTableLock() and
2fec0 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20   lockTable()).. 
2fed0 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
2fee0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20  TableLock(p, 1, 
2fef0 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
2ff00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ff10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
2ff20 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
2ff30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2ff40 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
2ff50 30 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a  0 && idx<=15 );.
2ff60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2ff70 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
2ff80 65 72 2c 20 31 2c 20 26 70 44 62 50 61 67 65 29  er, 1, &pDbPage)
2ff90 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2ffa0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
2ffb0 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
2ffc0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31  rn rc;.  }.  pP1
2ffd0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
2ffe0 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  r *)sqlite3Pager
2fff0 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
30000 3b 0a 20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74  ;.  *pMeta = get
30010 34 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20  4byte(&pP1[36 + 
30020 69 64 78 2a 34 5d 29 3b 0a 20 20 73 71 6c 69 74  idx*4]);.  sqlit
30030 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
30040 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Page);..  /* If 
30050 61 75 74 6f 76 61 63 75 75 6d 65 64 20 69 73 20  autovacuumed is 
30060 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 69 73  disabled in this
30070 20 62 75 69 6c 64 20 62 75 74 20 77 65 20 61 72   build but we ar
30080 65 20 74 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a  e trying to .  *
30090 2a 20 61 63 63 65 73 73 20 61 6e 20 61 75 74 6f  * access an auto
300a0 76 61 63 75 75 6d 65 64 20 64 61 74 61 62 61 73  vacuumed databas
300b0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 74 68 65  e, then make the
300c0 20 64 61 74 61 62 61 73 65 20 72 65 61 64 6f 6e   database readon
300d0 6c 79 2e 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ly. .  */.#ifdef
300e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
300f0 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 69 64  OVACUUM.  if( id
30100 78 3d 3d 34 20 26 26 20 2a 70 4d 65 74 61 3e 30  x==4 && *pMeta>0
30110 20 29 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79   ) pBt->readOnly
30120 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 1;.#endif..  
30130 2f 2a 20 47 72 61 62 20 74 68 65 20 72 65 61 64  /* Grab the read
30140 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 2e  -lock on page 1.
30150 20 2a 2f 0a 20 20 72 63 20 3d 20 6c 6f 63 6b 54   */.  rc = lockT
30160 61 62 6c 65 28 70 2c 20 31 2c 20 52 45 41 44 5f  able(p, 1, READ_
30170 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33  LOCK);.  sqlite3
30180 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
30190 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
301a0 2a 0a 2a 2a 20 57 72 69 74 65 20 6d 65 74 61 2d  *.** Write meta-
301b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b  information back
301c0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
301d0 73 65 2e 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a  se.  Meta[0] is.
301e0 2a 2a 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64  ** read-only and
301f0 20 6d 61 79 20 6e 6f 74 20 62 65 20 77 72 69 74   may not be writ
30200 74 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ten..*/.int sqli
30210 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
30220 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ta(Btree *p, int
30230 20 69 64 78 2c 20 75 33 32 20 69 4d 65 74 61 29   idx, u32 iMeta)
30240 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
30250 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e  t = p->pBt;.  un
30260 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 31  signed char *pP1
30270 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
30280 73 65 72 74 28 20 69 64 78 3e 3d 31 20 26 26 20  sert( idx>=1 && 
30290 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 73 71 6c  idx<=15 );.  sql
302a0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
302b0 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
302c0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69  ->db;.  if( p->i
302d0 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
302e0 49 54 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ITE ){.    rc = 
302f0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20  pBt->readOnly ? 
30300 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
30310 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  : SQLITE_ERROR;.
30320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
30330 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
30340 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 31 20 3d  !=0 );.    pP1 =
30350 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
30360 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ata;.    rc = sq
30370 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30380 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
30390 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
303a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
303b0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
303c0 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c  pP1[36 + idx*4],
303d0 20 69 4d 65 74 61 29 3b 0a 23 69 66 6e 64 65 66   iMeta);.#ifndef
303e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
303f0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
30400 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20 20 20 20  ( idx==7 ){.    
30410 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
30420 3e 61 75 74 6f 56 61 63 75 75 6d 20 7c 7c 20 69  >autoVacuum || i
30430 4d 65 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Meta==0 );.     
30440 20 20 20 61 73 73 65 72 74 28 20 69 4d 65 74 61     assert( iMeta
30450 3d 3d 30 20 7c 7c 20 69 4d 65 74 61 3d 3d 31 20  ==0 || iMeta==1 
30460 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
30470 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 69 4d 65  incrVacuum = iMe
30480 74 61 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ta;.      }.#end
30490 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  if.    }.  }.  s
304a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
304b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
304c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
304d0 6e 20 74 68 65 20 66 6c 61 67 20 62 79 74 65 20  n the flag byte 
304e0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
304f0 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
30500 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  t the cursor.** 
30510 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
30520 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74  nting to..*/.int
30530 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 6c 61   sqlite3BtreeFla
30540 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  gs(BtCursor *pCu
30550 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
30560 68 61 74 20 61 62 6f 75 74 20 43 55 52 53 4f 52  hat about CURSOR
30570 5f 52 45 51 55 49 52 45 53 45 45 4b 20 73 74 61  _REQUIRESEEK sta
30580 74 65 3f 20 50 72 6f 62 61 62 6c 79 20 6e 65 65  te? Probably nee
30590 64 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72  d to call.  ** r
305a0 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
305b0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 68 65  sorPosition() he
305c0 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61  re..  */.  MemPa
305d0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 72 65 73  ge *pPage;.  res
305e0 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
305f0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
30600 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
30610 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
30620 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
30630 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
30640 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
30650 3d 3d 70 43 75 72 2d 3e 70 42 74 20 29 3b 0a 20  ==pCur->pBt );. 
30660 20 72 65 74 75 72 6e 20 70 50 61 67 65 20 3f 20   return pPage ? 
30670 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
30680 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a  ge->hdrOffset] :
30690 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65   0;.}.../*.** Re
306a0 74 75 72 6e 20 74 68 65 20 70 61 67 65 72 20 61  turn the pager a
306b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
306c0 20 42 54 72 65 65 2e 20 20 54 68 69 73 20 72 6f   BTree.  This ro
306d0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
306e0 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
306f0 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
30700 0a 2a 2f 0a 50 61 67 65 72 20 2a 73 71 6c 69 74  .*/.Pager *sqlit
30710 65 33 42 74 72 65 65 50 61 67 65 72 28 42 74 72  e3BtreePager(Btr
30720 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ee *p){.  return
30730 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b   p->pBt->pPager;
30740 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
30750 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54  TE_OMIT_INTEGRIT
30760 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70  Y_CHECK./*.** Ap
30770 70 65 6e 64 20 61 20 6d 65 73 73 61 67 65 20 74  pend a message t
30780 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  o the error mess
30790 61 67 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  age string..*/.s
307a0 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
307b0 41 70 70 65 6e 64 4d 73 67 28 0a 20 20 49 6e 74  AppendMsg(.  Int
307c0 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
307d0 2c 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 31 2c  ,.  char *zMsg1,
307e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
307f0 46 6f 72 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b  Format,.  ....){
30800 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
30810 20 63 68 61 72 20 2a 7a 4d 73 67 32 3b 0a 20 20   char *zMsg2;.  
30820 69 66 28 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45  if( !pCheck->mxE
30830 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  rr ) return;.  p
30840 43 68 65 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a  Check->mxErr--;.
30850 20 20 70 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b    pCheck->nErr++
30860 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
30870 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73   zFormat);.  zMs
30880 67 32 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  g2 = sqlite3VMPr
30890 69 6e 74 66 28 30 2c 20 7a 46 6f 72 6d 61 74 2c  intf(0, zFormat,
308a0 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
308b0 70 29 3b 0a 20 20 69 66 28 20 7a 4d 73 67 31 3d  p);.  if( zMsg1=
308c0 3d 30 20 29 20 7a 4d 73 67 31 20 3d 20 22 22 3b  =0 ) zMsg1 = "";
308d0 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 7a  .  if( pCheck->z
308e0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 63 68  ErrMsg ){.    ch
308f0 61 72 20 2a 7a 4f 6c 64 20 3d 20 70 43 68 65 63  ar *zOld = pChec
30900 6b 2d 3e 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20  k->zErrMsg;.    
30910 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20  pCheck->zErrMsg 
30920 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
30930 53 65 74 53 74 72 69 6e 67 28 26 70 43 68 65 63  SetString(&pChec
30940 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4f 6c 64  k->zErrMsg, zOld
30950 2c 20 22 5c 6e 22 2c 20 7a 4d 73 67 31 2c 20 7a  , "\n", zMsg1, z
30960 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30 29 3b  Msg2, (char*)0);
30970 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
30980 65 28 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65  e(zOld);.  }else
30990 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  {.    sqlite3Set
309a0 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e  String(&pCheck->
309b0 7a 45 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20  zErrMsg, zMsg1, 
309c0 7a 4d 73 67 32 2c 20 28 63 68 61 72 2a 29 30 29  zMsg2, (char*)0)
309d0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
309e0 66 72 65 65 28 7a 4d 73 67 32 29 3b 0a 7d 0a 23  free(zMsg2);.}.#
309f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
30a00 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
30a10 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HECK */..#ifndef
30a20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
30a30 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
30a40 2a 2a 20 41 64 64 20 31 20 74 6f 20 74 68 65 20  ** Add 1 to the 
30a50 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
30a60 66 6f 72 20 70 61 67 65 20 69 50 61 67 65 2e 20  for page iPage. 
30a70 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
30a80 73 65 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65  second.** refere
30a90 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c  nce to the page,
30aa0 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65   add an error me
30ab0 73 73 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d  ssage to pCheck-
30ac0 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74  >zErrMsg..** Ret
30ad0 75 72 6e 20 31 20 69 66 20 74 68 65 72 65 20 61  urn 1 if there a
30ae0 72 65 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65  re 2 ore more re
30af0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
30b00 70 61 67 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a  page and 0 if.**
30b10 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
30b20 66 69 72 73 74 20 72 65 66 65 72 65 6e 63 65 20  first reference 
30b30 74 6f 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  to the page..**.
30b40 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68  ** Also check th
30b50 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  at the page numb
30b60 65 72 20 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e  er is in bounds.
30b70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
30b80 68 65 63 6b 52 65 66 28 49 6e 74 65 67 72 69 74  heckRef(Integrit
30b90 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74  yCk *pCheck, int
30ba0 20 69 50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43   iPage, char *zC
30bb0 6f 6e 74 65 78 74 29 7b 0a 20 20 69 66 28 20 69  ontext){.  if( i
30bc0 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Page==0 ) return
30bd0 20 31 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3e   1;.  if( iPage>
30be0 70 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c  pCheck->nPage ||
30bf0 20 69 50 61 67 65 3c 30 20 29 7b 0a 20 20 20 20   iPage<0 ){.    
30c00 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
30c10 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
30c20 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65 20 6e   "invalid page n
30c30 75 6d 62 65 72 20 25 64 22 2c 20 69 50 61 67 65  umber %d", iPage
30c40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
30c50 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 68 65 63  .  }.  if( pChec
30c60 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d  k->anRef[iPage]=
30c70 3d 31 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  =1 ){.    checkA
30c80 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
30c90 20 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20   zContext, "2nd 
30ca0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
30cb0 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  e %d", iPage);. 
30cc0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
30cd0 0a 20 20 72 65 74 75 72 6e 20 20 28 70 43 68 65  .  return  (pChe
30ce0 63 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d  ck->anRef[iPage]
30cf0 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65  ++)>1;.}..#ifnde
30d00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
30d10 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43  TOVACUUM./*.** C
30d20 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 65 6e  heck that the en
30d30 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
30d40 65 72 2d 6d 61 70 20 66 6f 72 20 70 61 67 65 20  er-map for page 
30d50 69 43 68 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a  iChild maps to .
30d60 2a 2a 20 70 61 67 65 20 69 50 61 72 65 6e 74 2c  ** page iParent,
30d70 20 70 6f 69 6e 74 65 72 20 74 79 70 65 20 70 74   pointer type pt
30d80 72 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61  rType. If not, a
30d90 70 70 65 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  ppend an error m
30da0 65 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68  essage.** to pCh
30db0 65 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eck..*/.static v
30dc0 6f 69 64 20 63 68 65 63 6b 50 74 72 6d 61 70 28  oid checkPtrmap(
30dd0 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  .  IntegrityCk *
30de0 70 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74  pCheck,   /* Int
30df0 65 67 72 69 74 79 20 63 68 65 63 6b 20 63 6f 6e  egrity check con
30e00 74 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  text */.  Pgno i
30e10 43 68 69 6c 64 2c 20 20 20 20 20 20 20 20 20 20  Child,          
30e20 20 2f 2a 20 43 68 69 6c 64 20 70 61 67 65 20 6e   /* Child page n
30e30 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 54  umber */.  u8 eT
30e40 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
30e50 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f    /* Expected po
30e60 69 6e 74 65 72 20 6d 61 70 20 74 79 70 65 20 2a  inter map type *
30e70 2f 0a 20 20 50 67 6e 6f 20 69 50 61 72 65 6e 74  /.  Pgno iParent
30e80 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ,          /* Ex
30e90 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d  pected pointer m
30ea0 61 70 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  ap parent page n
30eb0 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  umber */.  char 
30ec0 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20  *zContext       
30ed0 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65 73    /* Context des
30ee0 63 72 69 70 74 69 6f 6e 20 28 75 73 65 64 20 66  cription (used f
30ef0 6f 72 20 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f  or error msg) */
30f00 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
30f10 75 38 20 65 50 74 72 6d 61 70 54 79 70 65 3b 0a  u8 ePtrmapType;.
30f20 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 50 61    Pgno iPtrmapPa
30f30 72 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74  rent;..  rc = pt
30f40 72 6d 61 70 47 65 74 28 70 43 68 65 63 6b 2d 3e  rmapGet(pCheck->
30f50 70 42 74 2c 20 69 43 68 69 6c 64 2c 20 26 65 50  pBt, iChild, &eP
30f60 74 72 6d 61 70 54 79 70 65 2c 20 26 69 50 74 72  trmapType, &iPtr
30f70 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66  mapParent);.  if
30f80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30f90 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
30fa0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
30fb0 6f 6e 74 65 78 74 2c 20 22 46 61 69 6c 65 64 20  ontext, "Failed 
30fc0 74 6f 20 72 65 61 64 20 70 74 72 6d 61 70 20 6b  to read ptrmap k
30fd0 65 79 3d 25 64 22 2c 20 69 43 68 69 6c 64 29 3b  ey=%d", iChild);
30fe0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
30ff0 0a 0a 20 20 69 66 28 20 65 50 74 72 6d 61 70 54  ..  if( ePtrmapT
31000 79 70 65 21 3d 65 54 79 70 65 20 7c 7c 20 69 50  ype!=eType || iP
31010 74 72 6d 61 70 50 61 72 65 6e 74 21 3d 69 50 61  trmapParent!=iPa
31020 72 65 6e 74 20 29 7b 0a 20 20 20 20 63 68 65 63  rent ){.    chec
31030 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
31040 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20  k, zContext, .  
31050 20 20 20 20 22 42 61 64 20 70 74 72 20 6d 61 70      "Bad ptr map
31060 20 65 6e 74 72 79 20 6b 65 79 3d 25 64 20 65 78   entry key=%d ex
31070 70 65 63 74 65 64 3d 28 25 64 2c 25 64 29 20 67  pected=(%d,%d) g
31080 6f 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20 20  ot=(%d,%d)", .  
31090 20 20 20 20 69 43 68 69 6c 64 2c 20 65 54 79 70      iChild, eTyp
310a0 65 2c 20 69 50 61 72 65 6e 74 2c 20 65 50 74 72  e, iParent, ePtr
310b0 6d 61 70 54 79 70 65 2c 20 69 50 74 72 6d 61 70  mapType, iPtrmap
310c0 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23  Parent);.  }.}.#
310d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  endif../*.** Che
310e0 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  ck the integrity
310f0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
31100 20 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c   or of an overfl
31110 6f 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a  ow page list..**
31120 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
31130 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
31140 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20   on the list is 
31150 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  N..*/.static voi
31160 64 20 63 68 65 63 6b 4c 69 73 74 28 0a 20 20 49  d checkList(.  I
31170 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65  ntegrityCk *pChe
31180 63 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69 74  ck,  /* Integrit
31190 79 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65  y checking conte
311a0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72  xt */.  int isFr
311b0 65 65 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  eeList,       /*
311c0 20 54 72 75 65 20 66 6f 72 20 61 20 66 72 65 65   True for a free
311d0 6c 69 73 74 2e 20 20 46 61 6c 73 65 20 66 6f 72  list.  False for
311e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c   overflow page l
311f0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ist */.  int iPa
31200 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
31210 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
31220 72 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20  r first page in 
31230 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  the list */.  in
31240 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t N,            
31250 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20      /* Expected 
31260 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
31270 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  in the list */. 
31280 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20   char *zContext 
31290 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
312a0 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  t for error mess
312b0 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ages */.){.  int
312c0 20 69 3b 0a 20 20 69 6e 74 20 65 78 70 65 63 74   i;.  int expect
312d0 65 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46  ed = N;.  int iF
312e0 69 72 73 74 20 3d 20 69 50 61 67 65 3b 0a 20 20  irst = iPage;.  
312f0 77 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26  while( N-- > 0 &
31300 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20  & pCheck->mxErr 
31310 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70  ){.    DbPage *p
31320 4f 76 66 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e  OvflPage;.    un
31330 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4f 76  signed char *pOv
31340 66 6c 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  flData;.    if( 
31350 69 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 20  iPage<1 ){.     
31360 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
31370 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
31380 2c 0a 20 20 20 20 20 20 20 20 20 22 25 64 20 6f  ,.         "%d o
31390 66 20 25 64 20 70 61 67 65 73 20 6d 69 73 73 69  f %d pages missi
313a0 6e 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77  ng from overflow
313b0 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61   list starting a
313c0 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  t %d",.         
313d0 20 4e 2b 31 2c 20 65 78 70 65 63 74 65 64 2c 20   N+1, expected, 
313e0 69 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 62  iFirst);.      b
313f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
31400 69 66 28 20 63 68 65 63 6b 52 65 66 28 70 43 68  if( checkRef(pCh
31410 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  eck, iPage, zCon
31420 74 65 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20  text) ) break;. 
31430 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
31440 67 65 72 47 65 74 28 70 43 68 65 63 6b 2d 3e 70  gerGet(pCheck->p
31450 50 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61  Pager, (Pgno)iPa
31460 67 65 2c 20 26 70 4f 76 66 6c 50 61 67 65 29 20  ge, &pOvflPage) 
31470 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
31480 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
31490 7a 43 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c 65  zContext, "faile
314a0 64 20 74 6f 20 67 65 74 20 70 61 67 65 20 25 64  d to get page %d
314b0 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ", iPage);.     
314c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
314d0 20 20 70 4f 76 66 6c 44 61 74 61 20 3d 20 28 75    pOvflData = (u
314e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73  nsigned char *)s
314f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
31500 74 61 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20  ta(pOvflPage);. 
31510 20 20 20 69 66 28 20 69 73 46 72 65 65 4c 69 73     if( isFreeLis
31520 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
31530 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f 76   = get4byte(&pOv
31540 66 6c 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e  flData[4]);.#ifn
31550 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31560 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
31570 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74   if( pCheck->pBt
31580 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
31590 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
315a0 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 50 61 67  map(pCheck, iPag
315b0 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
315c0 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29  GE, 0, zContext)
315d0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
315e0 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 70 43 68  .      if( n>pCh
315f0 65 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  eck->pBt->usable
31600 53 69 7a 65 2f 34 2d 38 20 29 7b 0a 20 20 20 20  Size/4-8 ){.    
31610 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
31620 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
31630 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ext,.           
31640 22 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 63  "freelist leaf c
31650 6f 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20  ount too big on 
31660 70 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29  page %d", iPage)
31670 3b 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20  ;.        N--;. 
31680 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31690 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
316a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
316b0 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
316c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f 76   = get4byte(&pOv
316d0 66 6c 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a  flData[8+i*4]);.
316e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
316f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
31700 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 68           if( pCh
31710 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  eck->pBt->autoVa
31720 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
31730 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
31740 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67  pCheck, iFreePag
31750 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
31760 47 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29  GE, 0, zContext)
31770 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
31780 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 63  ndif.          c
31790 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20  heckRef(pCheck, 
317a0 69 46 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74  iFreePage, zCont
317b0 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ext);.        }.
317c0 20 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a          N -= n;.
317d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69        }.    }.#i
317e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
317f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
31800 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20   else{.      /* 
31810 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65  If this database
31820 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
31830 61 63 75 75 6d 20 61 6e 64 20 69 50 61 67 65 20  acuum and iPage 
31840 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a  is not the last.
31850 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
31860 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c   this overflow l
31870 69 73 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20  ist, check that 
31880 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
31890 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 20 20  entry for.      
318a0 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
318b0 20 70 61 67 65 20 6d 61 74 63 68 65 73 20 69 50   page matches iP
318c0 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  age..      */.  
318d0 20 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e      if( pCheck->
318e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
318f0 26 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20  && N>0 ){.      
31900 20 20 69 20 3d 20 67 65 74 34 62 79 74 65 28 70    i = get4byte(p
31910 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 20  OvflData);.     
31920 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
31930 43 68 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50  Check, i, PTRMAP
31940 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 50 61 67  _OVERFLOW2, iPag
31950 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
31960 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
31970 69 66 0a 20 20 20 20 69 50 61 67 65 20 3d 20 67  if.    iPage = g
31980 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74  et4byte(pOvflDat
31990 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  a);.    sqlite3P
319a0 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 50  agerUnref(pOvflP
319b0 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  age);.  }.}.#end
319c0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
319d0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
319e0 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
319f0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
31a00 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
31a10 44 6f 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74  Do various sanit
31a20 79 20 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69  y checks on a si
31a30 6e 67 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74  ngle page of a t
31a40 72 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ree.  Return.** 
31a50 74 68 65 20 74 72 65 65 20 64 65 70 74 68 2e 20  the tree depth. 
31a60 20 52 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75   Root pages retu
31a70 72 6e 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f  rn 0.  Parents o
31a80 66 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20  f root pages.** 
31a90 72 65 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f  return 1, and so
31aa0 20 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54   forth..** .** T
31ab0 68 65 73 65 20 63 68 65 63 6b 73 20 61 72 65 20  hese checks are 
31ac0 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  done:.**.**     
31ad0 20 31 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74   1.  Make sure t
31ae0 68 61 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72  hat cells and fr
31af0 65 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20  eeblocks do not 
31b00 6f 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20  overlap.**      
31b10 20 20 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20      but combine 
31b20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f  to completely co
31b30 76 65 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  ver the page..**
31b40 20 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73    NO  2.  Make s
31b50 75 72 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72  ure cell keys ar
31b60 65 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20  e in order..**  
31b70 4e 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72  NO  3.  Make sur
31b80 65 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73  e no key is less
31b90 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
31ba0 6f 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a  o zLowerBound..*
31bb0 2a 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20  *  NO  4.  Make 
31bc0 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67  sure no key is g
31bd0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
31be0 71 75 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f  qual to zUpperBo
31bf0 75 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20  und..**      5. 
31c00 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67   Check the integ
31c10 72 69 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77  rity of overflow
31c20 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20   pages..**      
31c30 36 2e 20 20 52 65 63 75 72 73 69 76 65 6c 79 20  6.  Recursively 
31c40 63 61 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61  call checkTreePa
31c50 67 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72  ge on all childr
31c60 65 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20  en..**      7.  
31c70 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
31c80 64 65 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69  depth of all chi
31c90 6c 64 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d  ldren is the sam
31ca0 65 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d  e..**      8.  M
31cb0 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 70 61  ake sure this pa
31cc0 67 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 33  ge is at least 3
31cd0 33 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20  3% full or else 
31ce0 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20  it is.**        
31cf0 20 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68    the root of th
31d00 65 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  e tree..*/.stati
31d10 63 20 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50  c int checkTreeP
31d20 61 67 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79  age(.  Integrity
31d30 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20  Ck *pCheck,  /* 
31d40 43 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20  Context for the 
31d50 73 61 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a  sanity check */.
31d60 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20    int iPage,    
31d70 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
31d80 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
31d90 67 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  ge to check */. 
31da0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
31db0 74 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74  t,     /* Parent
31dc0 20 70 61 67 65 20 2a 2f 0a 20 20 63 68 61 72 20   page */.  char 
31dd0 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 20  *zParentContext 
31de0 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65   /* Parent conte
31df0 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  xt */.){.  MemPa
31e00 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74  ge *pPage;.  int
31e10 20 69 2c 20 72 63 2c 20 64 65 70 74 68 2c 20 64   i, rc, depth, d
31e20 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20  2, pgno, cnt;.  
31e30 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c 53 74 61  int hdr, cellSta
31e40 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  rt;.  int nCell;
31e50 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 42  .  u8 *data;.  B
31e60 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20  tShared *pBt;.  
31e70 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  int usableSize;.
31e80 20 20 63 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b    char zContext[
31e90 31 30 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69  100];.  char *hi
31ea0 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  t;..  sqlite3_sn
31eb0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43  printf(sizeof(zC
31ec0 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78  ontext), zContex
31ed0 74 2c 20 22 50 61 67 65 20 25 64 3a 20 22 2c 20  t, "Page %d: ", 
31ee0 69 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 43 68  iPage);..  /* Ch
31ef0 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  eck that the pag
31f00 65 20 65 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20  e exists.  */.  
31f10 70 42 74 20 3d 20 70 43 68 65 63 6b 2d 3e 70 42  pBt = pCheck->pB
31f20 74 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  t;.  usableSize 
31f30 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
31f40 65 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d  e;.  if( iPage==
31f50 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
31f60 69 66 28 20 63 68 65 63 6b 52 65 66 28 70 43 68  if( checkRef(pCh
31f70 65 63 6b 2c 20 69 50 61 67 65 2c 20 7a 50 61 72  eck, iPage, zPar
31f80 65 6e 74 43 6f 6e 74 65 78 74 29 20 29 20 72 65  entContext) ) re
31f90 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 72  turn 0;.  if( (r
31fa0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
31fb0 47 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67  GetPage(pBt, (Pg
31fc0 6e 6f 29 69 50 61 67 65 2c 20 26 70 50 61 67 65  no)iPage, &pPage
31fd0 2c 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 0))!=0 ){.    
31fe0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
31ff0 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
32000 0a 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20  .       "unable 
32010 74 6f 20 67 65 74 20 74 68 65 20 70 61 67 65 2e  to get the page.
32020 20 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c   error code=%d",
32030 20 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   rc);.    return
32040 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 72   0;.  }.  if( (r
32050 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
32060 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  InitPage(pPage, 
32070 70 50 61 72 65 6e 74 29 29 21 3d 30 20 29 7b 0a  pParent))!=0 ){.
32080 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
32090 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
320a0 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ext, .          
320b0 20 20 20 20 20 20 20 20 20 22 73 71 6c 69 74 65           "sqlite
320c0 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29  3BtreeInitPage()
320d0 20 72 65 74 75 72 6e 73 20 65 72 72 6f 72 20 63   returns error c
320e0 6f 64 65 20 25 64 22 2c 20 72 63 29 3b 0a 20 20  ode %d", rc);.  
320f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
32100 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
32110 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68   0;.  }..  /* Ch
32120 65 63 6b 20 6f 75 74 20 61 6c 6c 20 74 68 65 20  eck out all the 
32130 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65  cells..  */.  de
32140 70 74 68 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  pth = 0;.  for(i
32150 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
32160 6c 6c 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78  ll && pCheck->mx
32170 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  Err; i++){.    u
32180 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e  8 *pCell;.    in
32190 74 20 73 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e  t sz;.    CellIn
321a0 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a  fo info;..    /*
321b0 20 43 68 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f   Check payload o
321c0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20  verflow pages.  
321d0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
321e0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
321f0 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e  (zContext), zCon
32200 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20  text,.          
32210 20 20 20 22 4f 6e 20 74 72 65 65 20 70 61 67 65     "On tree page
32220 20 25 64 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20   %d cell %d: ", 
32230 69 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 70  iPage, i);.    p
32240 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
32250 70 50 61 67 65 2c 69 29 3b 0a 20 20 20 20 73 71  pPage,i);.    sq
32260 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
32270 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
32280 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
32290 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61   sz = info.nData
322a0 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
322b0 2d 3e 69 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d  ->intKey ) sz +=
322c0 20 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20   info.nKey;.    
322d0 61 73 73 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f  assert( sz==info
322e0 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20  .nPayload );.   
322f0 20 69 66 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f   if( sz>info.nLo
32300 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  cal ){.      int
32310 20 6e 50 61 67 65 20 3d 20 28 73 7a 20 2d 20 69   nPage = (sz - i
32320 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61  nfo.nLocal + usa
32330 62 6c 65 53 69 7a 65 20 2d 20 35 29 2f 28 75 73  bleSize - 5)/(us
32340 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20  ableSize - 4);. 
32350 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76       Pgno pgnoOv
32360 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
32370 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
32380 6c 6f 77 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  low]);.#ifndef S
32390 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
323a0 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
323b0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
323c0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
323d0 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70  Ptrmap(pCheck, p
323e0 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  gnoOvfl, PTRMAP_
323f0 4f 56 45 52 46 4c 4f 57 31 2c 20 69 50 61 67 65  OVERFLOW1, iPage
32400 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
32410 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
32420 20 20 63 68 65 63 6b 4c 69 73 74 28 70 43 68 65    checkList(pChe
32430 63 6b 2c 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c  ck, 0, pgnoOvfl,
32440 20 6e 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   nPage, zContext
32450 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
32460 20 43 68 65 63 6b 20 73 61 6e 69 74 79 20 6f 66   Check sanity of
32470 20 6c 65 66 74 20 63 68 69 6c 64 20 70 61 67 65   left child page
32480 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
32490 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
324a0 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
324b0 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23  t4byte(pCell);.#
324c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
324d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
324e0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
324f0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
32500 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
32510 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52  Check, pgno, PTR
32520 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65  MAP_BTREE, iPage
32530 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
32540 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
32550 20 20 64 32 20 3d 20 63 68 65 63 6b 54 72 65 65    d2 = checkTree
32560 50 61 67 65 28 70 43 68 65 63 6b 2c 70 67 6e 6f  Page(pCheck,pgno
32570 2c 70 50 61 67 65 2c 7a 43 6f 6e 74 65 78 74 29  ,pPage,zContext)
32580 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20  ;.      if( i>0 
32590 26 26 20 64 32 21 3d 64 65 70 74 68 20 29 7b 0a  && d2!=depth ){.
325a0 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70          checkApp
325b0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
325c0 43 6f 6e 74 65 78 74 2c 20 22 43 68 69 6c 64 20  Context, "Child 
325d0 70 61 67 65 20 64 65 70 74 68 20 64 69 66 66 65  page depth diffe
325e0 72 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs");.      }.  
325f0 20 20 20 20 64 65 70 74 68 20 3d 20 64 32 3b 0a      depth = d2;.
32600 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
32610 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
32620 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
32630 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
32640 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
32650 65 74 2b 38 5d 29 3b 0a 20 20 20 20 73 71 6c 69  et+8]);.    sqli
32660 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
32670 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a  eof(zContext), z
32680 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20  Context, .      
32690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
326a0 4f 6e 20 70 61 67 65 20 25 64 20 61 74 20 72 69  On page %d at ri
326b0 67 68 74 20 63 68 69 6c 64 3a 20 22 2c 20 69 50  ght child: ", iP
326c0 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  age);.#ifndef SQ
326d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
326e0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
326f0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
32700 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
32710 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20  p(pCheck, pgno, 
32720 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 69 50  PTRMAP_BTREE, iP
32730 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  age, 0);.    }.#
32740 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54  endif.    checkT
32750 72 65 65 50 61 67 65 28 70 43 68 65 63 6b 2c 20  reePage(pCheck, 
32760 70 67 6e 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f  pgno, pPage, zCo
32770 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20  ntext);.  }. .  
32780 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d  /* Check for com
32790 70 6c 65 74 65 20 63 6f 76 65 72 61 67 65 20 6f  plete coverage o
327a0 66 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a  f the page.  */.
327b0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
327c0 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
327d0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
327e0 0a 20 20 68 69 74 20 3d 20 73 71 6c 69 74 65 33  .  hit = sqlite3
327f0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 75 73 61 62  MallocZero( usab
32800 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
32810 68 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  hit ){.    memse
32820 74 28 68 69 74 2c 20 31 2c 20 67 65 74 32 62 79  t(hit, 1, get2by
32830 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
32840 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 67  );.    nCell = g
32850 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
32860 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 53  r+3]);.    cellS
32870 74 61 72 74 20 3d 20 68 64 72 20 2b 20 31 32 20  tart = hdr + 12 
32880 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  - 4*pPage->leaf;
32890 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
328a0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
328b0 20 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32     int pc = get2
328c0 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 53  byte(&data[cellS
328d0 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  tart+i*2]);.    
328e0 20 20 75 31 36 20 73 69 7a 65 20 3d 20 63 65 6c    u16 size = cel
328f0 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
32900 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
32910 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
32920 66 28 20 28 70 63 2b 73 69 7a 65 2d 31 29 3e 3d  f( (pc+size-1)>=
32930 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 70 63  usableSize || pc
32940 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  <0 ){.        ch
32950 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
32960 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  eck, 0, .       
32970 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e       "Corruption
32980 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c   detected in cel
32990 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22  l %d on page %d"
329a0 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20  ,i,iPage,0);.   
329b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
329c0 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69 7a 65 2d    for(j=pc+size-
329d0 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68  1; j>=pc; j--) h
329e0 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d  it[j]++;.      }
329f0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 63  .    }.    for(c
32a00 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62 79 74 65  nt=0, i=get2byte
32a10 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 20  (&data[hdr+1]); 
32a20 69 3e 30 20 26 26 20 69 3c 75 73 61 62 6c 65 53  i>0 && i<usableS
32a30 69 7a 65 20 26 26 20 63 6e 74 3c 31 30 30 30 30  ize && cnt<10000
32a40 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20 63 6e  ; .           cn
32a50 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  t++){.      int 
32a60 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
32a70 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a 20 20 20  &data[i+2]);.   
32a80 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
32a90 69 66 28 20 28 69 2b 73 69 7a 65 2d 31 29 3e 3d  if( (i+size-1)>=
32aa0 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 69 3c  usableSize || i<
32ab0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  0 ){.        che
32ac0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
32ad0 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20 20 20 20  ck, 0,  .       
32ae0 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e       "Corruption
32af0 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c   detected in cel
32b00 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22  l %d on page %d"
32b10 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20  ,i,iPage,0);.   
32b20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32b30 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d 31    for(j=i+size-1
32b40 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69 74  ; j>=i; j--) hit
32b50 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  [j]++;.      }. 
32b60 20 20 20 20 20 69 20 3d 20 67 65 74 32 62 79 74       i = get2byt
32b70 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a 20 20 20  e(&data[i]);.   
32b80 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74   }.    for(i=cnt
32b90 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a 65  =0; i<usableSize
32ba0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
32bb0 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20  ( hit[i]==0 ){. 
32bc0 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
32bd0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 69      }else if( hi
32be0 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  t[i]>1 ){.      
32bf0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
32c00 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20 20 20 20  (pCheck, 0,.    
32c10 20 20 20 20 20 20 22 4d 75 6c 74 69 70 6c 65 20        "Multiple 
32c20 75 73 65 73 20 66 6f 72 20 62 79 74 65 20 25 64  uses for byte %d
32c30 20 6f 66 20 70 61 67 65 20 25 64 22 2c 20 69 2c   of page %d", i,
32c40 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
32c50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
32c60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e      }.    if( cn
32c70 74 21 3d 64 61 74 61 5b 68 64 72 2b 37 5d 20 29  t!=data[hdr+7] )
32c80 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
32c90 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30  endMsg(pCheck, 0
32ca0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 46 72  , .          "Fr
32cb0 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20 69  agmented space i
32cc0 73 20 25 64 20 62 79 74 65 20 72 65 70 6f 72 74  s %d byte report
32cd0 65 64 20 61 73 20 25 64 20 6f 6e 20 70 61 67 65  ed as %d on page
32ce0 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
32cf0 63 6e 74 2c 20 64 61 74 61 5b 68 64 72 2b 37 5d  cnt, data[hdr+7]
32d00 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  , iPage);.    }.
32d10 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
32d20 65 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65  ee(hit);..  rele
32d30 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
32d40 20 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b 31    return depth+1
32d50 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
32d60 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
32d70 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
32d80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32d90 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
32da0 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  K./*.** This rou
32db0 74 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d 70  tine does a comp
32dc0 6c 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74 68  lete check of th
32dd0 65 20 67 69 76 65 6e 20 42 54 72 65 65 20 66 69  e given BTree fi
32de0 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a  le.  aRoot[] is.
32df0 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  ** an array of p
32e00 61 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65 72  ages numbers wer
32e10 65 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d 62  e each page numb
32e20 65 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  er is the root p
32e30 61 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c  age of.** a tabl
32e40 65 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68 65  e.  nRoot is the
32e50 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
32e60 65 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a  es in aRoot..**.
32e70 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
32e80 20 63 68 65 63 6b 73 20 6f 75 74 2c 20 74 68 69   checks out, thi
32e90 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
32ea0 73 20 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d 65  s NULL.  If some
32eb0 74 68 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69 73  thing is.** amis
32ec0 73 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  s, an error mess
32ed0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
32ee0 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
32ef0 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
32f00 29 0a 2a 2a 20 61 6e 64 20 61 20 70 6f 69 6e 74  ).** and a point
32f10 65 72 20 74 6f 20 74 68 61 74 20 65 72 72 6f 72  er to that error
32f20 20 6d 65 73 73 61 67 65 20 69 73 20 72 65 74 75   message is retu
32f30 72 6e 65 64 2e 20 20 54 68 65 20 63 61 6c 6c 69  rned.  The calli
32f40 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  ng function.** i
32f50 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
32f60 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65 72  r freeing the er
32f70 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e  ror message when
32f80 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a   it is done..*/.
32f90 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
32fa0 65 65 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  eeIntegrityCheck
32fb0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
32fc0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74    /* The btree t
32fd0 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f 0a  o be checked */.
32fe0 20 20 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20 20    int *aRoot,   
32ff0 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66 20 72  /* An array of r
33000 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d 62 65 72  oot pages number
33010 73 20 66 6f 72 20 69 6e 64 69 76 69 64 75 61 6c  s for individual
33020 20 74 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74 20   trees */.  int 
33030 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75 6d  nRoot,    /* Num
33040 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
33050 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20 69  n aRoot[] */.  i
33060 6e 74 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a 20  nt mxErr,    /* 
33070 53 74 6f 70 20 72 65 70 6f 72 74 69 6e 67 20 65  Stop reporting e
33080 72 72 6f 72 73 20 61 66 74 65 72 20 74 68 69 73  rrors after this
33090 20 6d 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 2a   many */.  int *
330a0 70 6e 45 72 72 20 20 20 20 2f 2a 20 57 72 69 74  pnErr    /* Writ
330b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
330c0 72 73 20 73 65 65 6e 20 74 6f 20 74 68 69 73 20  rs seen to this 
330d0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  variable */.){. 
330e0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 52   int i;.  int nR
330f0 65 66 3b 0a 20 20 49 6e 74 65 67 72 69 74 79 43  ef;.  IntegrityC
33100 6b 20 73 43 68 65 63 6b 3b 0a 20 20 42 74 53 68  k sCheck;.  BtSh
33110 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33120 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
33130 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
33140 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
33150 20 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33    nRef = sqlite3
33160 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
33170 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
33180 28 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  ( lockBtreeWithR
33190 65 74 72 79 28 70 29 21 3d 53 51 4c 49 54 45 5f  etry(p)!=SQLITE_
331a0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
331b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
331c0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
331d0 65 33 53 74 72 44 75 70 28 22 55 6e 61 62 6c 65  e3StrDup("Unable
331e0 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 72 65   to acquire a re
331f0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
33200 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a 20  atabase");.  }. 
33210 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70 42   sCheck.pBt = pB
33220 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61 67  t;.  sCheck.pPag
33230 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
33240 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67 65  ;.  sCheck.nPage
33250 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
33260 61 67 65 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e  agecount(sCheck.
33270 70 50 61 67 65 72 29 3b 0a 20 20 73 43 68 65 63  pPager);.  sChec
33280 6b 2e 6d 78 45 72 72 20 3d 20 6d 78 45 72 72 3b  k.mxErr = mxErr;
33290 0a 20 20 73 43 68 65 63 6b 2e 6e 45 72 72 20 3d  .  sCheck.nErr =
332a0 20 30 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 30   0;.  *pnErr = 0
332b0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
332c0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
332d0 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75  .  if( pBt->nTru
332e0 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 43 68  nc!=0 ){.    sCh
332f0 65 63 6b 2e 6e 50 61 67 65 20 3d 20 70 42 74 2d  eck.nPage = pBt-
33300 3e 6e 54 72 75 6e 63 3b 0a 20 20 7d 0a 23 65 6e  >nTrunc;.  }.#en
33310 64 69 66 0a 20 20 69 66 28 20 73 43 68 65 63 6b  dif.  if( sCheck
33320 2e 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  .nPage==0 ){.   
33330 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
33340 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73  used(pBt);.    s
33350 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
33360 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
33370 30 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e  0;.  }.  sCheck.
33380 61 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 5f  anRef = sqlite3_
33390 6d 61 6c 6c 6f 63 28 20 28 73 43 68 65 63 6b 2e  malloc( (sCheck.
333a0 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28  nPage+1)*sizeof(
333b0 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29  sCheck.anRef[0])
333c0 20 29 3b 0a 20 20 69 66 28 20 21 73 43 68 65 63   );.  if( !sChec
333d0 6b 2e 61 6e 52 65 66 20 29 7b 0a 20 20 20 20 75  k.anRef ){.    u
333e0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
333f0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 6e  ed(pBt);.    *pn
33400 45 72 72 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  Err = 1;.    sql
33410 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
33420 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
33430 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 2d 3e  lite3MPrintf(p->
33440 64 62 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 6d  db, "Unable to m
33450 61 6c 6c 6f 63 20 25 64 20 62 79 74 65 73 22 2c  alloc %d bytes",
33460 20 0a 20 20 20 20 20 20 20 20 28 73 43 68 65 63   .        (sChec
33470 6b 2e 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f  k.nPage+1)*sizeo
33480 66 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30  f(sCheck.anRef[0
33490 5d 29 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ]));.  }.  for(i
334a0 3d 30 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  =0; i<=sCheck.nP
334b0 61 67 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63  age; i++){ sChec
334c0 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20  k.anRef[i] = 0; 
334d0 7d 0a 20 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f  }.  i = PENDING_
334e0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 3b 0a  BYTE_PAGE(pBt);.
334f0 20 20 69 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e    if( i<=sCheck.
33500 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 73 43 68  nPage ){.    sCh
33510 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31  eck.anRef[i] = 1
33520 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 7a  ;.  }.  sCheck.z
33530 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 2f  ErrMsg = 0;..  /
33540 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65  * Check the inte
33550 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65  grity of the fre
33560 65 6c 69 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65  elist.  */.  che
33570 63 6b 4c 69 73 74 28 26 73 43 68 65 63 6b 2c 20  ckList(&sCheck, 
33580 31 2c 20 67 65 74 34 62 79 74 65 28 26 70 42 74  1, get4byte(&pBt
33590 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
335a0 33 32 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20  32]),.          
335b0 20 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d    get4byte(&pBt-
335c0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
335d0 36 5d 29 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c  6]), "Main freel
335e0 69 73 74 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43  ist: ");..  /* C
335f0 68 65 63 6b 20 61 6c 6c 20 74 68 65 20 74 61 62  heck all the tab
33600 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  les..  */.  for(
33610 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74 20 26 26 20  i=0; i<nRoot && 
33620 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b  sCheck.mxErr; i+
33630 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 52 6f 6f  +){.    if( aRoo
33640 74 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  t[i]==0 ) contin
33650 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ue;.#ifndef SQLI
33660 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
33670 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
33680 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 61 52  autoVacuum && aR
33690 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20  oot[i]>1 ){.    
336a0 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 26 73    checkPtrmap(&s
336b0 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c  Check, aRoot[i],
336c0 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45   PTRMAP_ROOTPAGE
336d0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  , 0, 0);.    }.#
336e0 65 6e 64 69 66 0a 20 20 20 20 63 68 65 63 6b 54  endif.    checkT
336f0 72 65 65 50 61 67 65 28 26 73 43 68 65 63 6b 2c  reePage(&sCheck,
33700 20 61 52 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c   aRoot[i], 0, "L
33710 69 73 74 20 6f 66 20 74 72 65 65 20 72 6f 6f 74  ist of tree root
33720 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  s: ");.  }..  /*
33730 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72 79   Make sure every
33740 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
33750 65 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 0a  e is referenced.
33760 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20    */.  for(i=1; 
33770 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20  i<=sCheck.nPage 
33780 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b  && sCheck.mxErr;
33790 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51   i++){.#ifdef SQ
337a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
337b0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 73 43 68  CUUM.    if( sCh
337c0 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20  eck.anRef[i]==0 
337d0 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
337e0 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
337f0 20 30 2c 20 22 50 61 67 65 20 25 64 20 69 73 20   0, "Page %d is 
33800 6e 65 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b  never used", i);
33810 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
33820 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
33830 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
33840 6f 2d 76 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73  o-vacuum, make s
33850 75 72 65 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f  ure no tables co
33860 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66  ntain.    ** ref
33870 65 72 65 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74  erences to point
33880 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 0a 20 20  er-map pages..  
33890 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 43 68    */.    if( sCh
338a0 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20  eck.anRef[i]==0 
338b0 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d  && .       (PTRM
338c0 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69  AP_PAGENO(pBt, i
338d0 29 21 3d 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75  )!=i || !pBt->au
338e0 74 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20  toVacuum) ){.   
338f0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
33900 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50  g(&sCheck, 0, "P
33910 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20  age %d is never 
33920 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  used", i);.    }
33930 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e  .    if( sCheck.
33940 61 6e 52 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a  anRef[i]!=0 && .
33950 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50         (PTRMAP_P
33960 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69  AGENO(pBt, i)==i
33970 20 26 26 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   && pBt->autoVac
33980 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68  uum) ){.      ch
33990 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43  eckAppendMsg(&sC
339a0 68 65 63 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65  heck, 0, "Pointe
339b0 72 20 6d 61 70 20 70 61 67 65 20 25 64 20 69 73  r map page %d is
339c0 20 72 65 66 65 72 65 6e 63 65 64 22 2c 20 69 29   referenced", i)
339d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
339e0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
339f0 72 65 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73  re this analysis
33a00 20 64 69 64 20 6e 6f 74 20 6c 65 61 76 65 20 61   did not leave a
33a10 6e 79 20 75 6e 72 65 66 28 29 20 70 61 67 65 73  ny unref() pages
33a20 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74  .  */.  unlockBt
33a30 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
33a40 3b 0a 20 20 69 66 28 20 6e 52 65 66 20 21 3d 20  ;.  if( nRef != 
33a50 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
33a60 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
33a70 29 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  ) ){.    checkAp
33a80 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c  pendMsg(&sCheck,
33a90 20 30 2c 20 0a 20 20 20 20 20 20 22 4f 75 74 73   0, .      "Outs
33aa0 74 61 6e 64 69 6e 67 20 70 61 67 65 20 63 6f 75  tanding page cou
33ab0 6e 74 20 67 6f 65 73 20 66 72 6f 6d 20 25 64 20  nt goes from %d 
33ac0 74 6f 20 25 64 20 64 75 72 69 6e 67 20 74 68 69  to %d during thi
33ad0 73 20 61 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20  s analysis",.   
33ae0 20 20 20 6e 52 65 66 2c 20 73 71 6c 69 74 65 33     nRef, sqlite3
33af0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
33b00 74 2d 3e 70 50 61 67 65 72 29 0a 20 20 20 20 29  t->pPager).    )
33b10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  ;.  }..  /* Clea
33b20 6e 20 20 75 70 20 61 6e 64 20 72 65 70 6f 72 74  n  up and report
33b30 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
33b40 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
33b50 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e(p);.  sqlite3_
33b60 66 72 65 65 28 73 43 68 65 63 6b 2e 61 6e 52 65  free(sCheck.anRe
33b70 66 29 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 73  f);.  *pnErr = s
33b80 43 68 65 63 6b 2e 6e 45 72 72 3b 0a 20 20 72 65  Check.nErr;.  re
33b90 74 75 72 6e 20 73 43 68 65 63 6b 2e 7a 45 72 72  turn sCheck.zErr
33ba0 4d 73 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Msg;.}.#endif /*
33bb0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
33bc0 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a  EGRITY_CHECK */.
33bd0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
33be0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
33bf0 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
33c00 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  g database file.
33c10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
33c20 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76   filename is inv
33c30 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61  ariant as long a
33c40 73 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a  s the pager is.*
33c50 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20  * open so it is 
33c60 73 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77  safe to access w
33c70 69 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61  ithout the BtSha
33c80 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f  red mutex..*/.co
33c90 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
33ca0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
33cb0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
33cc0 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70  ssert( p->pBt->p
33cd0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65  Pager!=0 );.  re
33ce0 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65  turn sqlite3Page
33cf0 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74  rFilename(p->pBt
33d00 2d 3e 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  ->pPager);.}../*
33d10 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
33d20 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
33d30 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
33d40 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
33d50 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
33d60 54 68 65 20 70 61 67 65 72 20 64 69 72 65 63 74  The pager direct
33d70 6f 72 79 20 6e 61 6d 65 20 69 73 20 69 6e 76 61  ory name is inva
33d80 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73  riant as long as
33d90 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a   the pager is.**
33da0 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73   open so it is s
33db0 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77 69  afe to access wi
33dc0 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61 72  thout the BtShar
33dd0 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e  ed mutex..*/.con
33de0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
33df0 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28  BtreeGetDirname(
33e00 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
33e10 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61  ert( p->pBt->pPa
33e20 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ger!=0 );.  retu
33e30 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  rn sqlite3PagerD
33e40 69 72 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70  irname(p->pBt->p
33e50 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
33e60 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68   Return the path
33e70 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
33e80 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 74 68 69  nal file for thi
33e90 73 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  s database. The 
33ea0 72 65 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20  return.** value 
33eb0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
33ec0 69 73 20 74 68 65 20 73 61 6d 65 20 72 65 67 61  is the same rega
33ed0 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
33ee0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
33ef0 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
33f00 72 65 61 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a  reated or not..*
33f10 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6a  *.** The pager j
33f20 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
33f30 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20  is invariant as 
33f40 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61 67 65  long as the page
33f50 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20  r is.** open so 
33f60 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 61 63  it is safe to ac
33f70 63 65 73 73 20 77 69 74 68 6f 75 74 20 74 68 65  cess without the
33f80 20 42 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e   BtShared mutex.
33f90 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
33fa0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a  sqlite3BtreeGetJ
33fb0 6f 75 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65  ournalname(Btree
33fc0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
33fd0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  p->pBt->pPager!=
33fe0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
33ff0 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
34000 6c 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50  lname(p->pBt->pP
34010 61 67 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  ager);.}..#ifnde
34020 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  f SQLITE_OMIT_VA
34030 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  CUUM./*.** Copy 
34040 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e  the complete con
34050 74 65 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d 20  tent of pBtFrom 
34060 69 6e 74 6f 20 70 42 74 54 6f 2e 20 20 41 20 74  into pBtTo.  A t
34070 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75  ransaction.** mu
34080 73 74 20 62 65 20 61 63 74 69 76 65 20 66 6f 72  st be active for
34090 20 62 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a   both files..**.
340a0 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 66  ** The size of f
340b0 69 6c 65 20 70 54 6f 20 6d 61 79 20 62 65 20 72  ile pTo may be r
340c0 65 64 75 63 65 64 20 62 79 20 74 68 69 73 20 6f  educed by this o
340d0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20  peration..** If 
340e0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
340f0 6f 6e 67 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ong, the transac
34100 74 69 6f 6e 20 6f 6e 20 70 54 6f 20 69 73 20 72  tion on pTo is r
34110 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 0a 2a 2a 0a  olled back. .**.
34120 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
34130 2c 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  , CommitPhaseOne
34140 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  () may be called
34150 20 6f 6e 20 70 54 6f 20 62 65 66 6f 72 65 20 72   on pTo before r
34160 65 74 75 72 6e 69 6e 67 2e 20 0a 2a 2a 20 54 68  eturning. .** Th
34170 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
34180 66 69 6e 69 73 68 20 63 6f 6d 6d 69 74 74 69 6e  finish committin
34190 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
341a0 6e 20 6f 6e 20 70 54 6f 20 62 79 20 63 61 6c 6c  n on pTo by call
341b0 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  ing.** sqlite3Bt
341c0 72 65 65 43 6f 6d 6d 69 74 28 29 2e 0a 2a 2f 0a  reeCommit()..*/.
341d0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
341e0 43 6f 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a  CopyFile(Btree *
341f0 70 54 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f  pTo, Btree *pFro
34200 6d 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  m){.  int rc = S
34210 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f  QLITE_OK;.  Pgno
34220 20 69 3b 0a 0a 20 20 50 67 6e 6f 20 6e 46 72 6f   i;..  Pgno nFro
34230 6d 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 4e 75  mPage;     /* Nu
34240 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
34250 20 70 46 72 6f 6d 20 2a 2f 0a 20 20 50 67 6e 6f   pFrom */.  Pgno
34260 20 6e 54 6f 50 61 67 65 3b 20 20 20 20 20 20 20   nToPage;       
34270 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
34280 65 73 20 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 50  es in pTo */.  P
34290 67 6e 6f 20 6e 4e 65 77 50 61 67 65 3b 20 20 20  gno nNewPage;   
342a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
342b0 70 61 67 65 73 20 69 6e 20 70 54 6f 20 61 66 74  pages in pTo aft
342c0 65 72 20 74 68 65 20 63 6f 70 79 20 2a 2f 0a 0a  er the copy */..
342d0 20 20 50 67 6e 6f 20 69 53 6b 69 70 3b 20 20 20    Pgno iSkip;   
342e0 20 20 20 20 20 20 2f 2a 20 50 65 6e 64 69 6e 67        /* Pending
342f0 20 62 79 74 65 20 70 61 67 65 20 69 6e 20 70 54   byte page in pT
34300 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 50 61  o */.  int nToPa
34310 67 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 50 61  geSize;    /* Pa
34320 67 65 20 73 69 7a 65 20 6f 66 20 70 54 6f 20 69  ge size of pTo i
34330 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
34340 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 3b 20   nFromPageSize; 
34350 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6f 66   /* Page size of
34360 20 70 46 72 6f 6d 20 69 6e 20 62 79 74 65 73 20   pFrom in bytes 
34370 2a 2f 0a 0a 20 20 42 74 53 68 61 72 65 64 20 2a  */..  BtShared *
34380 70 42 74 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74  pBtTo = pTo->pBt
34390 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
343a0 74 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70  tFrom = pFrom->p
343b0 42 74 3b 0a 20 20 70 42 74 54 6f 2d 3e 64 62 20  Bt;.  pBtTo->db 
343c0 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20 20 70 42 74  = pTo->db;.  pBt
343d0 46 72 6f 6d 2d 3e 64 62 20 3d 20 70 46 72 6f 6d  From->db = pFrom
343e0 2d 3e 64 62 3b 0a 0a 20 20 6e 54 6f 50 61 67 65  ->db;..  nToPage
343f0 53 69 7a 65 20 3d 20 70 42 74 54 6f 2d 3e 70 61  Size = pBtTo->pa
34400 67 65 53 69 7a 65 3b 0a 20 20 6e 46 72 6f 6d 50  geSize;.  nFromP
34410 61 67 65 53 69 7a 65 20 3d 20 70 42 74 46 72 6f  ageSize = pBtFro
34420 6d 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20  m->pageSize;..  
34430 69 66 28 20 70 54 6f 2d 3e 69 6e 54 72 61 6e 73  if( pTo->inTrans
34440 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  !=TRANS_WRITE ||
34450 20 70 46 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21   pFrom->inTrans!
34460 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
34470 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34480 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
34490 66 28 20 70 42 74 54 6f 2d 3e 70 43 75 72 73 6f  f( pBtTo->pCurso
344a0 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
344b0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
344c0 0a 0a 20 20 6e 54 6f 50 61 67 65 20 3d 20 73 71  ..  nToPage = sq
344d0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
344e0 75 6e 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  unt(pBtTo->pPage
344f0 72 29 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65 20  r);.  nFromPage 
34500 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
34510 67 65 63 6f 75 6e 74 28 70 42 74 46 72 6f 6d 2d  gecount(pBtFrom-
34520 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 53 6b 69  >pPager);.  iSki
34530 70 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  p = PENDING_BYTE
34540 5f 50 41 47 45 28 70 42 74 54 6f 29 3b 0a 0a 20  _PAGE(pBtTo);.. 
34550 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 6e 4e 65   /* Variable nNe
34560 77 50 61 67 65 20 69 73 20 74 68 65 20 6e 75 6d  wPage is the num
34570 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 71  ber of pages req
34580 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74  uired to store t
34590 68 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73  he.  ** contents
345a0 20 6f 66 20 70 46 72 6f 6d 20 75 73 69 6e 67 20   of pFrom using 
345b0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
345c0 2d 73 69 7a 65 20 6f 66 20 70 54 6f 2e 0a 20 20  -size of pTo..  
345d0 2a 2f 0a 20 20 6e 4e 65 77 50 61 67 65 20 3d 20  */.  nNewPage = 
345e0 28 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 20  ((i64)nFromPage 
345f0 2a 20 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65  * (i64)nFromPage
34600 53 69 7a 65 20 2b 20 28 69 36 34 29 6e 54 6f 50  Size + (i64)nToP
34610 61 67 65 53 69 7a 65 20 2d 20 31 29 20 2f 20 0a  ageSize - 1) / .
34620 20 20 20 20 20 20 28 69 36 34 29 6e 54 6f 50 61        (i64)nToPa
34630 67 65 53 69 7a 65 3b 0a 0a 20 20 66 6f 72 28 69  geSize;..  for(i
34640 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =1; rc==SQLITE_O
34650 4b 20 26 26 20 28 69 3c 3d 6e 54 6f 50 61 67 65  K && (i<=nToPage
34660 20 7c 7c 20 69 3c 3d 6e 4e 65 77 50 61 67 65 29   || i<=nNewPage)
34670 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20  ; i++){..    /* 
34680 4a 6f 75 72 6e 61 6c 20 74 68 65 20 6f 72 69 67  Journal the orig
34690 69 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a  inal page..    *
346a0 2a 0a 20 20 20 20 2a 2a 20 69 53 6b 69 70 20 69  *.    ** iSkip i
346b0 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
346c0 72 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  r of the locking
346d0 20 70 61 67 65 20 28 50 45 4e 44 49 4e 47 5f 42   page (PENDING_B
346e0 59 54 45 5f 50 41 47 45 29 0a 20 20 20 20 2a 2a  YTE_PAGE).    **
346f0 20 69 6e 20 64 61 74 61 62 61 73 65 20 2a 70 54   in database *pT
34700 6f 20 28 62 65 66 6f 72 65 20 74 68 65 20 63 6f  o (before the co
34710 70 79 29 2e 20 54 68 69 73 20 70 61 67 65 20 69  py). This page i
34720 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
34730 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
34740 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 55   journal file. U
34750 6e 6c 65 73 73 20 69 3d 3d 69 53 6b 69 70 20 6f  nless i==iSkip o
34760 72 20 74 68 65 20 70 61 67 65 20 77 61 73 20 6e  r the page was n
34770 6f 74 0a 20 20 20 20 2a 2a 20 70 72 65 73 65 6e  ot.    ** presen
34780 74 20 69 6e 20 70 54 6f 20 62 65 66 6f 72 65 20  t in pTo before 
34790 74 68 65 20 63 6f 70 79 20 6f 70 65 72 61 74 69  the copy operati
347a0 6f 6e 2c 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  on, journal page
347b0 20 69 20 66 72 6f 6d 20 70 54 6f 2e 0a 20 20 20   i from pTo..   
347c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 21 3d 69   */.    if( i!=i
347d0 53 6b 69 70 20 26 26 20 69 3c 3d 6e 54 6f 50 61  Skip && i<=nToPa
347e0 67 65 20 29 7b 0a 20 20 20 20 20 20 44 62 50 61  ge ){.      DbPa
347f0 67 65 20 2a 70 44 62 50 61 67 65 20 3d 20 30 3b  ge *pDbPage = 0;
34800 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
34810 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 54  te3PagerGet(pBtT
34820 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70  o->pPager, i, &p
34830 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
34840 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34850 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
34860 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
34870 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
34880 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
34890 49 54 45 5f 4f 4b 20 26 26 20 69 3e 6e 46 72 6f  ITE_OK && i>nFro
348a0 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  mPage ){.       
348b0 20 20 20 2f 2a 20 59 65 61 68 2e 20 20 49 74 20     /* Yeah.  It 
348c0 73 65 65 6d 73 20 77 69 65 72 64 20 74 6f 20 63  seems wierd to c
348d0 61 6c 6c 20 44 6f 6e 74 57 72 69 74 65 28 29 20  all DontWrite() 
348e0 72 69 67 68 74 20 61 66 74 65 72 20 57 72 69 74  right after Writ
348f0 65 28 29 2e 20 42 75 74 0a 20 20 20 20 20 20 20  e(). But.       
34900 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 62 65     ** that is be
34910 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 73 20  cause the names 
34920 6f 66 20 74 68 6f 73 65 20 70 72 6f 63 65 64 75  of those procedu
34930 72 65 73 20 64 6f 20 6e 6f 74 20 65 78 61 63 74  res do not exact
34940 6c 79 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ly .          **
34950 20 72 65 70 72 65 73 65 6e 74 20 77 68 61 74 20   represent what 
34960 74 68 65 79 20 64 6f 2e 20 20 57 72 69 74 65 28  they do.  Write(
34970 29 20 72 65 61 6c 6c 79 20 6d 65 61 6e 73 20 22  ) really means "
34980 70 75 74 20 74 68 69 73 20 70 61 67 65 20 69 6e  put this page in
34990 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
349a0 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
349b0 61 6c 20 61 6e 64 20 6d 61 72 6b 20 69 74 20 61  al and mark it a
349c0 73 20 64 69 72 74 79 20 73 6f 20 74 68 61 74 20  s dirty so that 
349d0 69 74 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74  it will be writt
349e0 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  en.          ** 
349f0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
34a00 66 69 6c 65 20 6c 61 74 65 72 2e 22 20 20 44 6f  file later."  Do
34a10 6e 74 57 72 69 74 65 28 29 20 75 6e 64 6f 65 73  ntWrite() undoes
34a20 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 74   the second part
34a30 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   of.          **
34a40 20 74 68 61 74 20 61 6e 64 20 70 72 65 76 65 6e   that and preven
34a50 74 73 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ts the page from
34a60 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 74   being written t
34a70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
34a80 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  The.          **
34a90 20 70 61 67 65 20 69 73 20 73 74 69 6c 6c 20 6f   page is still o
34aa0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
34ab0 6f 75 72 6e 61 6c 2c 20 74 68 6f 75 67 68 2e 20  ournal, though. 
34ac0 20 41 6e 64 20 74 68 61 74 20 69 73 20 74 68 65   And that is the
34ad0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77   .          ** w
34ae0 68 6f 6c 65 20 70 6f 69 6e 74 20 6f 66 20 74 68  hole point of th
34af0 69 73 20 62 6c 6f 63 6b 3a 20 74 6f 20 70 75 74  is block: to put
34b00 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 72 6f   pages on the ro
34b10 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
34b20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
34b30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
34b40 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 44  agerDontWrite(pD
34b50 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
34b60 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
34b70 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
34b80 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
34b90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72    }..    /* Over
34ba0 77 72 69 74 65 20 74 68 65 20 64 61 74 61 20 69  write the data i
34bb0 6e 20 70 61 67 65 20 69 20 6f 66 20 74 68 65 20  n page i of the 
34bc0 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
34bd0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
34be0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 21 3d 69  QLITE_OK && i!=i
34bf0 53 6b 69 70 20 26 26 20 69 3c 3d 6e 4e 65 77 50  Skip && i<=nNewP
34c00 61 67 65 20 29 7b 0a 0a 20 20 20 20 20 20 44 62  age ){..      Db
34c10 50 61 67 65 20 2a 70 54 6f 50 61 67 65 20 3d 20  Page *pToPage = 
34c20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
34c30 5f 69 6e 74 36 34 20 69 4f 66 66 3b 0a 0a 20 20  _int64 iOff;..  
34c40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34c50 50 61 67 65 72 47 65 74 28 70 42 74 54 6f 2d 3e  PagerGet(pBtTo->
34c60 70 50 61 67 65 72 2c 20 69 2c 20 26 70 54 6f 50  pPager, i, &pToP
34c70 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
34c80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34c90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
34ca0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34cb0 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pToPage);.      
34cc0 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 0a 20 20  }..      for(.  
34cd0 20 20 20 20 20 20 69 4f 66 66 3d 28 69 2d 31 29        iOff=(i-1)
34ce0 2a 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20  *nToPageSize; . 
34cf0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
34d00 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 69 2a 6e  E_OK && iOff<i*n
34d10 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20  ToPageSize; .   
34d20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 46 72       iOff += nFr
34d30 6f 6d 50 61 67 65 53 69 7a 65 0a 20 20 20 20 20  omPageSize.     
34d40 20 29 7b 0a 20 20 20 20 20 20 20 20 44 62 50 61   ){.        DbPa
34d50 67 65 20 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20  ge *pFromPage = 
34d60 30 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  0;.        Pgno 
34d70 69 46 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46  iFrom = (iOff/nF
34d80 72 6f 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a  romPageSize)+1;.
34d90 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72  .        if( iFr
34da0 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  om==PENDING_BYTE
34db0 5f 50 41 47 45 28 70 42 74 46 72 6f 6d 29 20 29  _PAGE(pBtFrom) )
34dc0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
34dd0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
34de0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
34df0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
34e00 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69  tFrom->pPager, i
34e10 46 72 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67 65  From, &pFromPage
34e20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34e30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34e40 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
34e50 7a 54 6f 20 3d 20 73 71 6c 69 74 65 33 50 61 67  zTo = sqlite3Pag
34e60 65 72 47 65 74 44 61 74 61 28 70 54 6f 50 61 67  erGetData(pToPag
34e70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  e);.          ch
34e80 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c 69  ar *zFrom = sqli
34e90 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
34ea0 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20  pFromPage);.    
34eb0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b        int nCopy;
34ec0 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
34ed0 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 3e 3d 6e  nFromPageSize>=n
34ee0 54 6f 50 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ToPageSize ){.  
34ef0 20 20 20 20 20 20 20 20 20 20 7a 46 72 6f 6d 20            zFrom 
34f00 2b 3d 20 28 28 69 2d 31 29 2a 6e 54 6f 50 61 67  += ((i-1)*nToPag
34f10 65 53 69 7a 65 20 2d 20 28 28 69 46 72 6f 6d 2d  eSize - ((iFrom-
34f20 31 29 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  1)*nFromPageSize
34f30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
34f40 6e 43 6f 70 79 20 3d 20 6e 54 6f 50 61 67 65 53  nCopy = nToPageS
34f50 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ize;.          }
34f60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
34f70 20 20 7a 54 6f 20 2b 3d 20 28 28 28 69 46 72 6f    zTo += (((iFro
34f80 6d 2d 31 29 2a 6e 46 72 6f 6d 50 61 67 65 53 69  m-1)*nFromPageSi
34f90 7a 65 29 20 2d 20 28 69 2d 31 29 2a 6e 54 6f 50  ze) - (i-1)*nToP
34fa0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
34fb0 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 6e 46        nCopy = nF
34fc0 72 6f 6d 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  romPageSize;.   
34fd0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
34fe0 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 2c 20      memcpy(zTo, 
34ff0 7a 46 72 6f 6d 2c 20 6e 43 6f 70 79 29 3b 0a 09  zFrom, nCopy);..
35000 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
35010 72 65 66 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a  ref(pFromPage);.
35020 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35030 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  }..      if( pTo
35040 50 61 67 65 20 29 20 73 71 6c 69 74 65 33 50 61  Page ) sqlite3Pa
35050 67 65 72 55 6e 72 65 66 28 70 54 6f 50 61 67 65  gerUnref(pToPage
35060 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
35070 2f 2a 20 49 66 20 74 68 69 6e 67 73 20 68 61 76  /* If things hav
35080 65 20 77 6f 72 6b 65 64 20 73 6f 20 66 61 72 2c  e worked so far,
35090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
350a0 6c 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  le may need to b
350b0 65 20 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65  e .  ** truncate
350c0 64 2e 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 70  d. The complex p
350d0 61 72 74 20 69 73 20 74 68 61 74 20 69 74 20 6d  art is that it m
350e0 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 74 72  ay need to be tr
350f0 75 6e 63 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20  uncated to.  ** 
35100 61 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6e  a size that is n
35110 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
35120 6c 74 69 70 6c 65 20 6f 66 20 6e 54 6f 50 61 67  ltiple of nToPag
35130 65 53 69 7a 65 20 2d 20 74 68 65 20 63 75 72 72  eSize - the curr
35140 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20 73 69  ent.  ** page si
35150 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
35160 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  ager associated 
35170 77 69 74 68 20 42 2d 54 72 65 65 20 70 54 6f 2e  with B-Tree pTo.
35180 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65  .  **.  ** For e
35190 78 61 6d 70 6c 65 2c 20 73 61 79 20 74 68 65 20  xample, say the 
351a0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 70 54 6f  page-size of pTo
351b0 20 69 73 20 32 30 34 38 20 62 79 74 65 73 20 61   is 2048 bytes a
351c0 6e 64 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  nd the original 
351d0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
351e0 70 61 67 65 73 20 69 73 20 35 20 28 31 30 20 4b  pages is 5 (10 K
351f0 42 20 66 69 6c 65 29 2e 20 49 66 20 70 46 72 6f  B file). If pFro
35200 6d 20 68 61 73 20 61 20 70 61 67 65 20 73 69 7a  m has a page siz
35210 65 20 6f 66 20 31 30 32 34 20 0a 20 20 2a 2a 20  e of 1024 .  ** 
35220 62 79 74 65 73 20 61 6e 64 20 39 20 70 61 67 65  bytes and 9 page
35230 73 2c 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65  s, then the file
35240 20 6e 65 65 64 73 20 74 6f 20 62 65 20 74 72 75   needs to be tru
35250 6e 63 61 74 65 64 20 74 6f 20 39 4b 42 2e 0a 20  ncated to 9KB.. 
35260 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
35270 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
35280 66 28 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  f( nFromPageSize
35290 21 3d 6e 54 6f 50 61 67 65 53 69 7a 65 20 29 7b  !=nToPageSize ){
352a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
352b0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c  ile *pFile = sql
352c0 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42  ite3PagerFile(pB
352d0 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  tTo->pPager);.  
352e0 20 20 20 20 69 36 34 20 69 53 69 7a 65 20 3d 20      i64 iSize = 
352f0 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 53 69  (i64)nFromPageSi
35300 7a 65 20 2a 20 28 69 36 34 29 6e 46 72 6f 6d 50  ze * (i64)nFromP
35310 61 67 65 3b 0a 20 20 20 20 20 20 69 36 34 20 69  age;.      i64 i
35320 4e 6f 77 20 3d 20 28 69 36 34 29 28 28 6e 54 6f  Now = (i64)((nTo
35330 50 61 67 65 3e 6e 4e 65 77 50 61 67 65 29 3f 6e  Page>nNewPage)?n
35340 54 6f 50 61 67 65 3a 6e 4e 65 77 50 61 67 65 29  ToPage:nNewPage)
35350 20 2a 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53   * (i64)nToPageS
35360 69 7a 65 3b 20 0a 20 20 20 20 20 20 69 36 34 20  ize; .      i64 
35370 69 50 65 6e 64 69 6e 67 20 3d 20 28 28 69 36 34  iPending = ((i64
35380 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  )PENDING_BYTE_PA
35390 47 45 28 70 42 74 54 6f 29 2d 31 29 20 2a 28 69  GE(pBtTo)-1) *(i
353a0 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a  64)nToPageSize;.
353b0 20 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28    .      assert(
353c0 20 69 53 69 7a 65 3c 3d 69 4e 6f 77 20 29 3b 0a   iSize<=iNow );.
353d0 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d    .      /* Comm
353e0 69 74 20 70 68 61 73 65 20 6f 6e 65 20 73 79 6e  it phase one syn
353f0 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  cs the journal f
35400 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
35410 69 74 68 20 70 54 6f 20 0a 20 20 20 20 20 20 2a  ith pTo .      *
35420 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
35430 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 2e 20   original data. 
35440 49 74 20 64 6f 65 73 20 6e 6f 74 20 73 79 6e 63  It does not sync
35450 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35460 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 65  le.      ** itse
35470 6c 66 2e 20 41 66 74 65 72 20 64 6f 69 6e 67 20  lf. After doing 
35480 74 68 69 73 20 69 74 20 69 73 20 73 61 66 65 20  this it is safe 
35490 74 6f 20 75 73 65 20 4f 73 54 72 75 6e 63 61 74  to use OsTruncat
354a0 65 28 29 20 61 6e 64 20 6f 74 68 65 72 0a 20 20  e() and other.  
354b0 20 20 20 20 2a 2a 20 66 69 6c 65 20 41 50 49 73      ** file APIs
354c0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
354d0 20 66 69 6c 65 20 64 69 72 65 63 74 6c 79 2e 0a   file directly..
354e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
354f0 42 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e  BtTo->db = pTo->
35500 64 62 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  db;.      rc = s
35510 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
35520 74 50 68 61 73 65 4f 6e 65 28 70 42 74 54 6f 2d  tPhaseOne(pBtTo-
35530 3e 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20 31  >pPager, 0, 0, 1
35540 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69  );.      if( iSi
35550 7a 65 3c 69 4e 6f 77 20 26 26 20 72 63 3d 3d 53  ze<iNow && rc==S
35560 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35570 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35580 4f 73 54 72 75 6e 63 61 74 65 28 70 46 69 6c 65  OsTruncate(pFile
35590 2c 20 69 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , iSize);.      
355a0 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 54 68  }.  .      /* Th
355b0 65 20 6c 6f 6f 70 20 74 68 61 74 20 63 6f 70 69  e loop that copi
355c0 65 64 20 64 61 74 61 20 66 72 6f 6d 20 64 61 74  ed data from dat
355d0 61 62 61 73 65 20 70 46 72 6f 6d 20 74 6f 20 70  abase pFrom to p
355e0 54 6f 20 64 69 64 20 6e 6f 74 0a 20 20 20 20 20  To did not.     
355f0 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 74 68 65   ** populate the
35600 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20 6f 66   locking page of
35610 20 64 61 74 61 62 61 73 65 20 70 54 6f 2e 20 49   database pTo. I
35620 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  f the page-size 
35630 6f 66 0a 20 20 20 20 20 20 2a 2a 20 70 46 72 6f  of.      ** pFro
35640 6d 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  m is smaller tha
35650 6e 20 74 68 61 74 20 6f 66 20 70 54 6f 2c 20 74  n that of pTo, t
35660 68 69 73 20 6d 65 61 6e 73 20 73 6f 6d 65 20 64  his means some d
35670 61 74 61 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a  ata will.      *
35680 2a 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  * not have been 
35690 63 6f 70 69 65 64 2e 20 0a 20 20 20 20 20 20 2a  copied. .      *
356a0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
356b0 62 6c 6f 63 6b 20 63 6f 70 69 65 73 20 74 68 65  block copies the
356c0 20 6d 69 73 73 69 6e 67 20 64 61 74 61 20 66 72   missing data fr
356d0 6f 6d 20 64 61 74 61 62 61 73 65 20 70 46 72 6f  om database pFro
356e0 6d 20 74 6f 20 70 54 6f 20 0a 20 20 20 20 20 20  m to pTo .      
356f0 2a 2a 20 75 73 69 6e 67 20 66 69 6c 65 20 41 50  ** using file AP
35700 49 73 2e 20 54 68 69 73 20 69 73 20 73 61 66 65  Is. This is safe
35710 20 62 65 63 61 75 73 65 20 61 74 20 74 68 69 73   because at this
35720 20 70 6f 69 6e 74 20 77 65 20 6b 6e 6f 77 20 74   point we know t
35730 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  hat.      ** all
35740 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
35750 20 64 61 74 61 20 66 72 6f 6d 20 70 54 6f 20 68   data from pTo h
35760 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 69  as been synced i
35770 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 2a  nto the .      *
35780 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
35790 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
357a0 20 77 6f 75 6c 64 20 62 65 20 73 61 66 65 20 74   would be safe t
357b0 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 61 74  o do anything at
357c0 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 74 6f  .      ** all to
357d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
357e0 6c 65 20 65 78 63 65 70 74 20 74 72 75 6e 63 61  le except trunca
357f0 74 65 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79  te it to zero by
35800 74 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tes..      */.  
35810 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35820 54 45 5f 4f 4b 20 26 26 20 6e 46 72 6f 6d 50 61  TE_OK && nFromPa
35830 67 65 53 69 7a 65 3c 6e 54 6f 50 61 67 65 53 69  geSize<nToPageSi
35840 7a 65 20 26 26 20 69 53 69 7a 65 3e 69 50 65 6e  ze && iSize>iPen
35850 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 20 20 69  ding){.        i
35860 36 34 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20  64 iOff;.       
35870 20 66 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20   for(.          
35880 69 4f 66 66 3d 69 50 65 6e 64 69 6e 67 3b 20 0a  iOff=iPending; .
35890 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
358a0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c  LITE_OK && iOff<
358b0 28 69 50 65 6e 64 69 6e 67 2b 6e 54 6f 50 61 67  (iPending+nToPag
358c0 65 53 69 7a 65 29 3b 20 0a 20 20 20 20 20 20 20  eSize); .       
358d0 20 20 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d     iOff += nFrom
358e0 50 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20  PageSize.       
358f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62   ){.          Db
35900 50 61 67 65 20 2a 70 46 72 6f 6d 50 61 67 65 20  Page *pFromPage 
35910 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 50  = 0;.          P
35920 67 6e 6f 20 69 46 72 6f 6d 20 3d 20 28 69 4f 66  gno iFrom = (iOf
35930 66 2f 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29  f/nFromPageSize)
35940 2b 31 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  +1;.  .         
35950 20 69 66 28 20 69 46 72 6f 6d 3d 3d 50 45 4e 44   if( iFrom==PEND
35960 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
35970 74 46 72 6f 6d 29 20 7c 7c 20 69 46 72 6f 6d 3e  tFrom) || iFrom>
35980 6e 46 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20 20  nFromPage ){.   
35990 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
359a0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
359b0 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d   .          rc =
359c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
359d0 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72  (pBtFrom->pPager
359e0 2c 20 69 46 72 6f 6d 2c 20 26 70 46 72 6f 6d 50  , iFrom, &pFromP
359f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
35a00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35a10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
35a20 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 73   char *zFrom = s
35a30 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
35a40 74 61 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20  ta(pFromPage);. 
35a50 20 09 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33   .  rc = sqlite3
35a60 4f 73 57 72 69 74 65 28 70 46 69 6c 65 2c 20 7a  OsWrite(pFile, z
35a70 46 72 6f 6d 2c 20 6e 46 72 6f 6d 50 61 67 65 53  From, nFromPageS
35a80 69 7a 65 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20  ize, iOff);.    
35a90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
35aa0 61 67 65 72 55 6e 72 65 66 28 70 46 72 6f 6d 50  agerUnref(pFromP
35ab0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
35ac0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
35ad0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
35ae0 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
35af0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  e file */.      
35b00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35b10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
35b20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  = sqlite3PagerSy
35b30 6e 63 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  nc(pBtTo->pPager
35b40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
35b50 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
35b60 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
35b70 6e 63 61 74 65 28 70 42 74 54 6f 2d 3e 70 50 61  ncate(pBtTo->pPa
35b80 67 65 72 2c 20 6e 4e 65 77 50 61 67 65 29 3b 0a  ger, nNewPage);.
35b90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
35ba0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35bb0 20 20 20 20 20 70 42 74 54 6f 2d 3e 70 61 67 65       pBtTo->page
35bc0 53 69 7a 65 46 69 78 65 64 20 3d 20 30 3b 0a 20  SizeFixed = 0;. 
35bd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
35be0 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
35bf0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
35c00 54 6f 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  To);.  }..  retu
35c10 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73  rn rc;  .}.int s
35c20 71 6c 69 74 65 33 42 74 72 65 65 43 6f 70 79 46  qlite3BtreeCopyF
35c30 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20  ile(Btree *pTo, 
35c40 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20  Btree *pFrom){. 
35c50 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
35c60 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 54 6f  e3BtreeEnter(pTo
35c70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
35c80 65 45 6e 74 65 72 28 70 46 72 6f 6d 29 3b 0a 20  eEnter(pFrom);. 
35c90 20 72 63 20 3d 20 62 74 72 65 65 43 6f 70 79 46   rc = btreeCopyF
35ca0 69 6c 65 28 70 54 6f 2c 20 70 46 72 6f 6d 29 3b  ile(pTo, pFrom);
35cb0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
35cc0 65 61 76 65 28 70 46 72 6f 6d 29 3b 0a 20 20 73  eave(pFrom);.  s
35cd0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
35ce0 28 70 54 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pTo);.  return 
35cf0 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
35d00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
35d10 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  UUM */../*.** Re
35d20 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
35d30 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
35d40 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  s active..*/.int
35d50 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
35d60 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29  nTrans(Btree *p)
35d70 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
35d80 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
35d90 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
35da0 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
35db0 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61   (p && (p->inTra
35dc0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
35dd0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
35de0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61  rn non-zero if a
35df0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
35e00 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
35e10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
35e20 42 74 72 65 65 49 73 49 6e 53 74 6d 74 28 42 74  BtreeIsInStmt(Bt
35e30 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
35e40 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
35e50 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
35e60 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74    return (p->pBt
35e70 20 26 26 20 70 2d 3e 70 42 74 2d 3e 69 6e 53 74   && p->pBt->inSt
35e80 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  mt);.}../*.** Re
35e90 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
35ea0 20 61 20 72 65 61 64 20 28 6f 72 20 77 72 69 74   a read (or writ
35eb0 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  e) transaction i
35ec0 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  s active..*/.int
35ed0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
35ee0 6e 52 65 61 64 54 72 61 6e 73 28 42 74 72 65 65  nReadTrans(Btree
35ef0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
35f00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
35f10 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
35f20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20   );.  return (p 
35f30 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  && (p->inTrans!=
35f40 54 52 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a  TRANS_NONE));.}.
35f50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
35f60 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
35f70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f 62  ointer to a blob
35f80 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
35f90 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20  iated with.** a 
35fa0 73 69 6e 67 6c 65 20 73 68 61 72 65 64 2d 62 74  single shared-bt
35fb0 72 65 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20  ree. The memory 
35fc0 69 73 20 75 73 65 64 20 62 79 20 63 6c 69 65 6e  is used by clien
35fd0 74 20 63 6f 64 65 20 66 6f 72 20 69 74 73 20 6f  t code for its o
35fe0 77 6e 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 28  wn.** purposes (
35ff0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20  for example, to 
36000 73 74 6f 72 65 20 61 20 68 69 67 68 2d 6c 65 76  store a high-lev
36010 65 6c 20 73 63 68 65 6d 61 20 61 73 73 6f 63 69  el schema associ
36020 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
36030 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 29 2e  e shared-btree).
36040 20 54 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   The btree layer
36050 20 6d 61 6e 61 67 65 73 20 72 65 66 65 72 65 6e   manages referen
36060 63 65 20 63 6f 75 6e 74 69 6e 67 20 69 73 73 75  ce counting issu
36070 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  es..**.** The fi
36080 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 69 73  rst time this is
36090 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61   called on a sha
360a0 72 65 64 2d 62 74 72 65 65 2c 20 6e 42 79 74 65  red-btree, nByte
360b0 73 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  s bytes of memor
360c0 79 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74  y.** are allocat
360d0 65 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20  ed, zeroed, and 
360e0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
360f0 63 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63 68  caller. For each
36100 20 73 75 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20   subsequent .** 
36110 63 61 6c 6c 20 74 68 65 20 6e 42 79 74 65 73 20  call the nBytes 
36120 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
36130 6f 72 65 64 20 61 6e 64 20 61 20 70 6f 69 6e 74  ored and a point
36140 65 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20 62  er to the same b
36150 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79  lob.** of memory
36160 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a   returned. .**.*
36170 2a 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68  * Just before th
36180 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 69  e shared-btree i
36190 73 20 63 6c 6f 73 65 64 2c 20 74 68 65 20 66 75  s closed, the fu
361a0 6e 63 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73  nction passed as
361b0 20 74 68 65 20 0a 2a 2a 20 78 46 72 65 65 20 61   the .** xFree a
361c0 72 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 65  rgument when the
361d0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
361e0 6f 6e 20 77 61 73 20 6d 61 64 65 20 69 73 20 69  on was made is i
361f0 6e 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a  nvoked on the .*
36200 2a 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61  * blob of alloca
36210 74 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73  ted memory. This
36220 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
36230 20 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74 65   not call sqlite
36240 33 5f 66 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74  3_free().** on t
36250 68 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62  he memory, the b
36260 74 72 65 65 20 6c 61 79 65 72 20 64 6f 65 73 20  tree layer does 
36270 74 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  that..*/.void *s
36280 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
36290 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  a(Btree *p, int 
362a0 6e 42 79 74 65 73 2c 20 76 6f 69 64 28 2a 78 46  nBytes, void(*xF
362b0 72 65 65 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20  ree)(void *)){. 
362c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
362d0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
362e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
362f0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 53 63  .  if( !pBt->pSc
36300 68 65 6d 61 20 29 7b 0a 20 20 20 20 70 42 74 2d  hema ){.    pBt-
36310 3e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  >pSchema = sqlit
36320 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 42 79  e3MallocZero(nBy
36330 74 65 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78  tes);.    pBt->x
36340 46 72 65 65 53 63 68 65 6d 61 20 3d 20 78 46 72  FreeSchema = xFr
36350 65 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ee;.  }.  sqlite
36360 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
36370 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 70 53    return pBt->pS
36380 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  chema;.}../*.** 
36390 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61  Return true if a
363a0 6e 6f 74 68 65 72 20 75 73 65 72 20 6f 66 20 74  nother user of t
363b0 68 65 20 73 61 6d 65 20 73 68 61 72 65 64 20 62  he same shared b
363c0 74 72 65 65 20 61 73 20 74 68 65 20 61 72 67 75  tree as the argu
363d0 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68  ment.** handle h
363e0 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76  olds an exclusiv
363f0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71  e lock on the sq
36400 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
36410 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
36420 33 42 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b  3BtreeSchemaLock
36430 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
36440 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
36450 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
36460 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
36470 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
36480 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
36490 72 63 20 3d 20 28 71 75 65 72 79 54 61 62 6c 65  rc = (queryTable
364a0 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
364b0 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21  OOT, READ_LOCK)!
364c0 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73  =SQLITE_OK);.  s
364d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
364e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
364f0 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
36500 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
36510 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74  _CACHE./*.** Obt
36520 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ain a lock on th
36530 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f  e table whose ro
36540 6f 74 20 70 61 67 65 20 69 73 20 69 54 61 62 2e  ot page is iTab.
36550 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73    The.** lock is
36560 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66   a write lock if
36570 20 69 73 57 72 69 74 65 6c 6f 63 6b 20 69 73 20   isWritelock is 
36580 74 72 75 65 20 6f 72 20 61 20 72 65 61 64 20 6c  true or a read l
36590 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  ock.** if it is 
365a0 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  false..*/.int sq
365b0 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61  lite3BtreeLockTa
365c0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
365d0 74 20 69 54 61 62 2c 20 75 38 20 69 73 57 72 69  t iTab, u8 isWri
365e0 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  teLock){.  int r
365f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
36600 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
36610 20 29 7b 0a 20 20 20 20 75 38 20 6c 6f 63 6b 54   ){.    u8 lockT
36620 79 70 65 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 20  ype = READ_LOCK 
36630 2b 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20  + isWriteLock;. 
36640 20 20 20 61 73 73 65 72 74 28 20 52 45 41 44 5f     assert( READ_
36650 4c 4f 43 4b 2b 31 3d 3d 57 52 49 54 45 5f 4c 4f  LOCK+1==WRITE_LO
36660 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
36670 28 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30  ( isWriteLock==0
36680 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d   || isWriteLock=
36690 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =1 );.    sqlite
366a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
366b0 20 20 20 20 72 63 20 3d 20 71 75 65 72 79 54 61      rc = queryTa
366c0 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 2c  bleLock(p, iTab,
366d0 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20   lockType);.    
366e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
366f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
36700 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 69 54 61  lockTable(p, iTa
36710 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  b, lockType);.  
36720 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
36730 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
36740 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
36750 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
36760 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
36770 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75  RBLOB./*.** Argu
36780 6d 65 6e 74 20 70 43 73 72 20 6d 75 73 74 20 62  ment pCsr must b
36790 65 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65  e a cursor opene
367a0 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e  d for writing on
367b0 20 61 6e 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74   an .** INTKEY t
367c0 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 70  able currently p
367d0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c  ointing at a val
367e0 69 64 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20  id table entry. 
367f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
36800 6e 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 64  n modifies the d
36810 61 74 61 20 73 74 6f 72 65 64 20 61 73 20 70 61  ata stored as pa
36820 72 74 20 6f 66 20 74 68 61 74 20 65 6e 74 72 79  rt of that entry
36830 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61  ..** Only the da
36840 74 61 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f  ta content may o
36850 6e 6c 79 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  nly be modified,
36860 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
36870 62 6c 65 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65  ble.** to change
36880 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
36890 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 2e 0a  he data stored..
368a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
368b0 72 65 65 50 75 74 44 61 74 61 28 42 74 43 75 72  reePutData(BtCur
368c0 73 6f 72 20 2a 70 43 73 72 2c 20 75 33 32 20 6f  sor *pCsr, u32 o
368d0 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20  ffset, u32 amt, 
368e0 76 6f 69 64 20 2a 7a 29 7b 0a 20 20 61 73 73 65  void *z){.  asse
368f0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
36900 75 74 65 78 28 70 43 73 72 29 20 29 3b 0a 20 20  utex(pCsr) );.  
36910 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
36920 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 73 72 2d  mutex_held(pCsr-
36930 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
36940 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
36950 70 43 73 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  pCsr->isIncrblob
36960 48 61 6e 64 6c 65 29 3b 0a 20 20 69 66 28 20 70  Handle);.  if( p
36970 43 73 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Csr->eState>=CUR
36980 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
36990 29 7b 0a 20 20 20 20 69 66 28 20 70 43 73 72 2d  ){.    if( pCsr-
369a0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
369b0 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 72  FAULT ){.      r
369c0 65 74 75 72 6e 20 70 43 73 72 2d 3e 73 6b 69 70  eturn pCsr->skip
369d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
369e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
369f0 5f 41 42 4f 52 54 3b 0a 20 20 20 20 7d 0a 20 20  _ABORT;.    }.  
36a00 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 73 6f  }..  /* Check so
36a10 6d 65 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73  me preconditions
36a20 3a 20 0a 20 20 2a 2a 20 20 20 28 61 29 20 74 68  : .  **   (a) th
36a30 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
36a40 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 0a 20 20   for writing,.  
36a50 2a 2a 20 20 20 28 62 29 20 74 68 65 72 65 20 69  **   (b) there i
36a60 73 20 6e 6f 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  s no read-lock o
36a70 6e 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  n the table bein
36a80 67 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 0a 20  g modified and. 
36a90 20 2a 2a 20 20 20 28 63 29 20 74 68 65 20 63 75   **   (c) the cu
36aa0 72 73 6f 72 20 70 6f 69 6e 74 73 20 61 74 20 61  rsor points at a
36ab0 20 76 61 6c 69 64 20 72 6f 77 20 6f 66 20 61 6e   valid row of an
36ac0 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2e 0a 20   intKey table.. 
36ad0 20 2a 2f 0a 20 20 69 66 28 20 21 70 43 73 72 2d   */.  if( !pCsr-
36ae0 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  >wrFlag ){.    r
36af0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
36b00 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 61 73 73  DONLY;.  }.  ass
36b10 65 72 74 28 20 21 70 43 73 72 2d 3e 70 42 74 2d  ert( !pCsr->pBt-
36b20 3e 72 65 61 64 4f 6e 6c 79 20 0a 20 20 20 20 20  >readOnly .     
36b30 20 20 20 20 20 26 26 20 70 43 73 72 2d 3e 70 42       && pCsr->pB
36b40 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
36b50 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
36b60 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64  .  if( checkRead
36b70 4c 6f 63 6b 73 28 70 43 73 72 2d 3e 70 42 74 72  Locks(pCsr->pBtr
36b80 65 65 2c 20 70 43 73 72 2d 3e 70 67 6e 6f 52 6f  ee, pCsr->pgnoRo
36b90 6f 74 2c 20 70 43 73 72 29 20 29 7b 0a 20 20 20  ot, pCsr) ){.   
36ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
36bb0 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61  OCKED; /* The ta
36bc0 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20  ble pCur points 
36bd0 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  to has a read lo
36be0 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ck */.  }.  if( 
36bf0 70 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCsr->eState==CU
36c00 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
36c10 21 70 43 73 72 2d 3e 70 50 61 67 65 2d 3e 69 6e  !pCsr->pPage->in
36c20 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
36c30 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
36c40 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61  .  }..  return a
36c50 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 73  ccessPayload(pCs
36c60 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
36c70 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
36c80 29 7a 2c 20 30 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  )z, 0, 1);.}../*
36c90 20 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20   .** Set a flag 
36ca0 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 74  on this cursor t
36cb0 6f 20 63 61 63 68 65 20 74 68 65 20 6c 6f 63 61  o cache the loca
36cc0 74 69 6f 6e 73 20 6f 66 20 70 61 67 65 73 20 66  tions of pages f
36cd0 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 6f 76 65 72  rom the .** over
36ce0 66 6c 6f 77 20 6c 69 73 74 20 66 6f 72 20 74 68  flow list for th
36cf0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 54  e current row. T
36d00 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 63  his is used by c
36d10 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a  ursors opened.**
36d20 20 66 6f 72 20 69 6e 63 72 65 6d 65 6e 74 61 6c   for incremental
36d30 20 62 6c 6f 62 20 49 4f 20 6f 6e 6c 79 2e 0a 2a   blob IO only..*
36d40 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
36d50 6f 6e 20 73 65 74 73 20 61 20 66 6c 61 67 20 6f  on sets a flag o
36d60 6e 6c 79 2e 20 54 68 65 20 61 63 74 75 61 6c 20  nly. The actual 
36d70 70 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 63 61  page location ca
36d80 63 68 65 0a 2a 2a 20 28 73 74 6f 72 65 64 20 69  che.** (stored i
36d90 6e 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  n BtCursor.aOver
36da0 66 6c 6f 77 5b 5d 29 20 69 73 20 61 6c 6c 6f 63  flow[]) is alloc
36db0 61 74 65 64 20 61 6e 64 20 75 73 65 64 20 62 79  ated and used by
36dc0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63 63   function.** acc
36dd0 65 73 73 50 61 79 6c 6f 61 64 28 29 20 28 74 68  essPayload() (th
36de0 65 20 77 6f 72 6b 65 72 20 66 75 6e 63 74 69 6f  e worker functio
36df0 6e 20 66 6f 72 20 73 71 6c 69 74 65 33 42 74 72  n for sqlite3Btr
36e00 65 65 44 61 74 61 28 29 20 61 6e 64 0a 2a 2a 20  eeData() and.** 
36e10 73 71 6c 69 74 65 33 42 74 72 65 65 50 75 74 44  sqlite3BtreePutD
36e20 61 74 61 28 29 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ata())..*/.void 
36e30 73 71 6c 69 74 65 33 42 74 72 65 65 43 61 63 68  sqlite3BtreeCach
36e40 65 4f 76 65 72 66 6c 6f 77 28 42 74 43 75 72 73  eOverflow(BtCurs
36e50 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
36e60 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
36e70 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
36e80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36e90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
36ea0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
36eb0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
36ec0 28 21 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c  (!pCur->isIncrbl
36ed0 6f 62 48 61 6e 64 6c 65 29 3b 0a 20 20 61 73 73  obHandle);.  ass
36ee0 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72  ert(!pCur->aOver
36ef0 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 69  flow);.  pCur->i
36f00 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
36f10 3d 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a        = 1;.}.#endif.