/ Hex Artifact Content
Login

Artifact 7a80e4a67f32a2494c383a28a495bf3bd71cc230:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 23 69 66 6e 64  xffff)+1)..#ifnd
05c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
05e0: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
05f0: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0600: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0610: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0620: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0630: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
0640: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
0650: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
0660: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
0670: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
0680: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
0690: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
06a0: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
06b0: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2a   test builds..**
06c0: 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68  .** Access to th
06d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 70  is variable is p
06e0: 72 6f 74 65 63 74 65 64 20 62 79 20 53 51 4c 49  rotected by SQLI
06f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0700: 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66 64 65  MASTER..*/.#ifde
0710: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0720: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0730: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0740: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0750: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0760: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0770: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0780: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
0790: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
07a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
07b0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
07c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
07d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
07e0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
07f0: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0800: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0810: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0830: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0840: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0850: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0860: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0870: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
0880: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
0890: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
08a0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
08b0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
08c0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
08d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
08e0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
08f0: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0900: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
0910: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
0920: 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  heEnabled = enab
0930: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
0940: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
0950: 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ....#ifdef SQLIT
0960: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0970: 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  CHE.  /*.  ** Th
0980: 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72  e functions quer
0990: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
09a0: 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72  eLock(), setShar
09b0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
09c0: 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65  (),.  ** and cle
09d0: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
09e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a  TableLocks().  *
09f0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0a00: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0a10: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0a20: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
0a30: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0a40: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0a50: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0a60: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0a70: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0a80: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0a90: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0aa0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0ab0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0ac0: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0ad0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0ae0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0af0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0b00: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0b10: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0b20: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
0b30: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0b40: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0b50: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0b60: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
0b70: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
0b80: 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ne setSharedCach
0b90: 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  eTableLock(a,b,c
0ba0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
0bb0: 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68  efine clearAllSh
0bc0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0bd0: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0be0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
0bf0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c00: 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65 20  ks(a).  #define 
0c10: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
0c20: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64 29  bleLock(a,b,c,d)
0c30: 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61 73   1.  #define has
0c40: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61 2c  ReadConflicts(a,
0c50: 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69   b) 0.#endif..#i
0c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0c70: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a  T_SHARED_CACHE..
0c80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0c90: 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73  BUG./*.**** This
0ca0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0cb0: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0cc0: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0cd0: 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a  atement. ***.**.
0ce0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0cf0: 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20  if pBtree holds 
0d00: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
0d10: 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ks to read or wr
0d20: 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74  ite to the .** t
0d30: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
0d40: 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74  age iRoot.   Ret
0d50: 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73  urn 1 if it does
0d60: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
0d70: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
0d80: 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  , when writing t
0d90: 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 72  o a table with r
0da0: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76  oot-page iRoot v
0db0: 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e  ia .** Btree con
0dc0: 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a  nection pBtree:.
0dd0: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
0de0: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0df0: 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c  ableLock(pBtree,
0e00: 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45   iRoot, 0, WRITE
0e10: 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  _LOCK) );.**.** 
0e20: 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  When writing to 
0e30: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72 65  an index that re
0e40: 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72 61  sides in a shara
0e50: 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ble database, th
0e60: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
0e70: 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20 6f  uld have first o
0e80: 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73  btained a lock s
0e90: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f  pecifying the ro
0ea0: 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  ot page of.** th
0eb0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
0ec0: 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65  table. This make
0ed0: 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d  s things a bit m
0ee0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c  ore complicated,
0ef0: 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75  .** as this modu
0f00: 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20 74  le treats each t
0f10: 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72 61  able as a separa
0f20: 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f  te structure. To
0f30: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68   determine.** th
0f40: 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
0f50: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
0f60: 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ex being written
0f70: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
0f80: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
0f90: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
0fa0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
0fb0: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
0fc0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
0fd0: 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  le/index rooted 
0fe0: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74  at page iRoot, t
0ff0: 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a  he caller may.**
1000: 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f   hold a write-lo
1010: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1020: 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67   table (root pag
1030: 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c  e 1). This is al
1040: 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65  so.** acceptable
1050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1060: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1070: 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65  bleLock(.  Btree
1080: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
1090: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74    /* Handle that
10a0: 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20   must hold lock 
10b0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  */.  Pgno iRoot,
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10d0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72  oot page of b-tr
10e0: 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e  ee */.  int isIn
10f0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f  dex,           /
1100: 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20  * True if iRoot 
1110: 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  is the root of a
1120: 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  n index b-tree *
1130: 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70  /.  int eLockTyp
1140: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  e          /* Re
1150: 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65  quired lock type
1160: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
1170: 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b  RITE_LOCK) */.){
1180: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
1190: 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70  ma = (Schema *)p
11a0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68  Btree->pBt->pSch
11b0: 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62  ema;.  Pgno iTab
11c0: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
11d0: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
11e0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
11f0: 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20   not shareable, 
1200: 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74  or if the client
1210: 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a   is reading.  **
1220: 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65 61   and has the rea
1230: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1240: 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20  ag set, then no 
1250: 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  lock is required
1260: 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  . .  ** Return t
1270: 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  rue immediately.
1280: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  .  */.  if( (pBt
1290: 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30  ree->sharable==0
12a0: 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79  ).   || (eLockTy
12b0: 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26  pe==READ_LOCK &&
12c0: 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c   (pBtree->db->fl
12d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
12e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20  dUncommitted)). 
12f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1300: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1310: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1320: 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e 67  ding  or writing
1330: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74 68   an index and th
1340: 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a 2a  e schema is.  **
1350: 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65   not loaded, the
1360: 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66 66  n it is too diff
1370: 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c 6c  icult to actuall
1380: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  y check to see i
1390: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72 65  f.  ** the corre
13a0: 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  ct locks are hel
13b0: 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62 6f  d.  So do not bo
13c0: 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  ther - just retu
13d0: 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54 68  rn true..  ** Th
13e0: 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  is case does not
13f0: 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f 66   come up very of
1400: 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ten anyhow..  */
1410: 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 26  .  if( isIndex &
1420: 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20 28  & (!pSchema || (
1430: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 26 44  pSchema->flags&D
1440: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d  B_SchemaLoaded)=
1450: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
1460: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
1470: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1480: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1490: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
14a0: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
14b0: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
14c0: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
14d0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
14e0: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
14f0: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1500: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1510: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
1520: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1530: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
1540: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
1550: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
1560: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
1570: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1580: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1590: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
15a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
15b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
15c0: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
15d0: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
15e0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
15f0: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69  ( pIdx->tnum==(i
1600: 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20  nt)iRoot ){.    
1610: 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d      iTab = pIdx-
1620: 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20  >pTable->tnum;. 
1630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1640: 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d  else{.    iTab =
1650: 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f   iRoot;.  }..  /
1660: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
1670: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1680: 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c  Either a write-l
1690: 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65  ock on root-page
16a0: 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77   iTab, a .  ** w
16b0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
16c0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f   schema table, o
16d0: 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74  r (if the client
16e0: 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20   is reading) a. 
16f0: 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   ** read-lock on
1700: 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69   iTab will suffi
1710: 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20  ce. Return 1 if 
1720: 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65  any of these are
1730: 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f   found.  */.  fo
1740: 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e  r(pLock=pBtree->
1750: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63  pBt->pLock; pLoc
1760: 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e  k; pLock=pLock->
1770: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1780: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
1790: 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28  Btree .     && (
17a0: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69  pLock->iTable==i
17b0: 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65  Tab || (pLock->e
17c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
17d0: 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c   && pLock->iTabl
17e0: 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70  e==1)).     && p
17f0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  Lock->eLock>=eLo
1800: 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20  ckType .    ){. 
1810: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1830: 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68  ailed to find th
1840: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1850: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
1860: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1870: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
1880: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1890: 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75  ./*.**** This fu
18a0: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73  nction may be us
18b0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
18c0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
18d0: 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a  s only. ****.**.
18e0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
18f0: 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c  f it would be il
1900: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1910: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
1920: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  he.** table or i
1930: 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69  ndex rooted at i
1940: 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68  Root because oth
1950: 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  er shared connec
1960: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d  tions are.** sim
1970: 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64  ultaneously read
1980: 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61  ing that same ta
1990: 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
19a0: 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
19b0: 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20  l for pBtree to 
19c0: 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74  write if some ot
19d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
19e0: 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20   that.** shares 
19f0: 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65  the same BtShare
1a00: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72  d object is curr
1a10: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
1a20: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
1a30: 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78  iRoot table.  Ex
1a40: 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68  cept, if the oth
1a50: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1a60: 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d  has the.** read-
1a70: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1a80: 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73   set, then it is
1a90: 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65   OK for the othe
1aa0: 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68  r object to.** h
1ab0: 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f  ave a read curso
1ac0: 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  r..**.** For exa
1ad0: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1ae0: 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74  ting to any part
1af0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
1b00: 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64   index.** rooted
1b10: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
1b20: 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a  one should call:
1b30: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
1b40: 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  ( !hasReadConfli
1b50: 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  cts(pBtree, iRoo
1b60: 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  t) );.*/.static 
1b70: 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c  int hasReadConfl
1b80: 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72  icts(Btree *pBtr
1b90: 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b  ee, Pgno iRoot){
1ba0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1bb0: 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
1bc0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1bd0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1be0: 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1bf0: 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26  t==iRoot .     &
1c00: 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74  & p->pBtree!=pBt
1c10: 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  ree.     && 0==(
1c20: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  p->pBtree->db->f
1c30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
1c40: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20  adUncommitted). 
1c50: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1c60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1c70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1c80: 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65  ndif    /* #ifde
1c90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
1ca0: 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  /../*.** Query t
1cb0: 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68  o see if Btree h
1cc0: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
1cd0: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
1ce0: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
1cf0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
1d00: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
1d10: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
1d20: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
1d30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
1d40: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
1d50: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
1d60: 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64  ing.** setShared
1d70: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
1d80: 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43  ), or SQLITE_LOC
1d90: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
1da0: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53  tatic int queryS
1db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1dc0: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
1dd0: 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63  no iTab, u8 eLoc
1de0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1df0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1e00: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
1e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1e30: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
1e40: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
1e50: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  K || eLock==WRIT
1e60: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
1e70: 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a  rt( p->db!=0 );.
1e80: 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64    assert( !(p->d
1e90: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1ea0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1eb0: 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ||eLock==WRITE_L
1ec0: 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a  OCK||iTab==1 );.
1ed0: 20 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65    .  /* If reque
1ee0: 73 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  sting a write-lo
1ef0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72  ck, then the Btr
1f00: 65 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20  ee must have an 
1f10: 6f 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20  open write.  ** 
1f20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f30: 68 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f  his file. And, o
1f40: 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68  bviously, for th
1f50: 69 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72  is to be so ther
1f60: 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  e .  ** must be 
1f70: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1f80: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1f90: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20   file itself..  
1fa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  */.  assert( eLo
1fb0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
1fc0: 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65   (p==pBt->pWrite
1fd0: 72 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  r && p->inTrans=
1fe0: 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b  =TRANS_WRITE) );
1ff0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
2000: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2010: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2020: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
2030: 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72  ;.  .  /* This r
2040: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2050: 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d  p if the shared-
2060: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61  cache is not ena
2070: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70  bled */.  if( !p
2080: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
2090: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
20b0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
20c0: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
20d0: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
20e0: 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65  ock, the.  ** re
20f0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79  quested lock may
2100: 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
2110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2120: 2d 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20  ->pWriter!=p && 
2130: 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
2140: 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21   BTS_EXCLUSIVE)!
2150: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2160: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2170: 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70  ed(p->db, pBt->p
2180: 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20  Writer->db);.   
2190: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
21a0: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
21b0: 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49  E;.  }..  for(pI
21c0: 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
21d0: 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
21e0: 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
21f0: 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e  /* The condition
2200: 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d   (pIter->eLock!=
2210: 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f  eLock) in the fo
2220: 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20  llowing if(...) 
2230: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
2240: 74 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63  t is a simplific
2250: 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a  ation of:.    **
2260: 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b  .    **   (eLock
2270: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20  ==WRITE_LOCK || 
2280: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2290: 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a  ITE_LOCK).    **
22a0: 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65  .    ** since we
22b0: 20 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c   know that if eL
22c0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c  ock==WRITE_LOCK,
22d0: 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63   then no other c
22e0: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  onnection.    **
22f0: 20 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54   may hold a WRIT
2300: 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61  E_LOCK on any ta
2310: 62 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ble in this file
2320: 20 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61   (since there ca
2330: 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65  n.    ** only be
2340: 20 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72   a single writer
2350: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  )..    */.    as
2360: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f  sert( pIter->eLo
2370: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
2380: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57   pIter->eLock==W
2390: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  RITE_LOCK );.   
23a0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
23b0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74  READ_LOCK || pIt
23c0: 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c  er->pBtree==p ||
23d0: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52   pIter->eLock==R
23e0: 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  EAD_LOCK);.    i
23f0: 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
2400: 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54  !=p && pIter->iT
2410: 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49  able==iTab && pI
2420: 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63  ter->eLock!=eLoc
2430: 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  k ){.      sqlit
2440: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
2450: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72  ked(p->db, pIter
2460: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20  ->pBtree->db);. 
2470: 20 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d       if( eLock==
2480: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  WRITE_LOCK ){.  
2490: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
24a0: 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  =pBt->pWriter );
24b0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74  .        pBt->bt
24c0: 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45  sFlags |= BTS_PE
24d0: 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20  NDING;.      }. 
24e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24f0: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
2500: 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  CACHE;.    }.  }
2510: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2520: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
2530: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
2540: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
2550: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2560: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
2570: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b  /*.** Add a lock
2580: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69   on the table wi
2590: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
25a0: 62 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65  ble to the share
25b0: 64 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20  d-btree used.** 
25c0: 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20  by Btree handle 
25d0: 70 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f  p. Parameter eLo
25e0: 63 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ck must be eithe
25f0: 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a  r READ_LOCK or .
2600: 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a  ** WRITE_LOCK..*
2610: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2620: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66  on assumes the f
2630: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
2640: 20 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66    (a) The specif
2650: 69 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74  ied Btree object
2660: 20 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20   p is connected 
2670: 74 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a  to a sharable.**
2680: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
2690: 28 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74  (one with the Bt
26a0: 53 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20  Shared.sharable 
26b0: 66 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a  flag set), and.*
26c0: 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74  *.**   (b) No ot
26d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
26e0: 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68  s hold a lock th
26f0: 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20  at conflicts.** 
2700: 20 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72        with the r
2710: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69  equested lock (i
2720: 2e 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43  .e. querySharedC
2730: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
2740: 68 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72  has.**       alr
2750: 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2760: 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51   and returned SQ
2770: 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20  LITE_OK)..**.** 
2780: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2790: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63  urned if the loc
27a0: 6b 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65  k is added succe
27b0: 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f  ssfully. SQLITE_
27c0: 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74  NOMEM .** is ret
27d0: 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f  urned if a mallo
27e0: 63 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e  c attempt fails.
27f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2800: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
2810: 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c  leLock(Btree *p,
2820: 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38   Pgno iTable, u8
2830: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
2840: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2850: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  t;.  BtLock *pLo
2860: 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b  ck = 0;.  BtLock
2870: 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65   *pIter;..  asse
2880: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2890: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
28a0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
28b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65  ==READ_LOCK || e
28c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
28d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
28e0: 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  >db!=0 );..  /* 
28f0: 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  A connection wit
2900: 68 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  h the read-uncom
2910: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20  mitted flag set 
2920: 77 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74  will never try t
2930: 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20  o.  ** obtain a 
2940: 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20  read-lock using 
2950: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54  this function. T
2960: 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63  he only read-loc
2970: 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20  k obtained.  ** 
2980: 62 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  by a connection 
2990: 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  in read-uncommit
29a0: 74 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74  ted mode is on t
29b0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
29c0: 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e   .  ** table, an
29d0: 64 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f  d that lock is o
29e0: 62 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65  btained in Btree
29f0: 42 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a  BeginTrans().  *
2a00: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28  /.  assert( 0==(
2a10: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  p->db->flags&SQL
2a20: 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
2a30: 74 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  ted) || eLock==W
2a40: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
2a50: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
2a60: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
2a70: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
2a80: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
2a90: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
2aa0: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
2ab0: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
2ac0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
2ad0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
2ae0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
2af0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
2b00: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
2b10: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
2b20: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
2b30: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
2b40: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
2b50: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
2b60: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
2b70: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
2b80: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
2b90: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
2ba0: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
2bb0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
2bc0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2bd0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
2be0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
2bf0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
2c00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c10: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
2c20: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
2c30: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
2c40: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
2c50: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
2c60: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
2c70: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
2c80: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
2c90: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
2ca0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
2cb0: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
2cc0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
2cd0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
2ce0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
2cf0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
2d00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2d10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2d20: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
2d30: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
2d40: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
2d50: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
2d60: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
2d70: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
2d80: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
2d90: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
2da0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
2db0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
2dc0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
2dd0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
2de0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
2df0: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
2e00: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
2e10: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
2e20: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
2e30: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
2e40: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
2e50: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
2e60: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
2e70: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
2e80: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
2e90: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
2ea0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
2eb0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
2ec0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
2ed0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ee0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
2ef0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
2f00: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
2f10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
2f20: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
2f30: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   Release all the
2f40: 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f   table locks (lo
2f50: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61  cks obtained via
2f60: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65   calls to.** the
2f70: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
2f80: 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65  ableLock() proce
2f90: 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74  dure) held by Bt
2fa0: 72 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a  ree object p..**
2fb0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2fc0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42  n assumes that B
2fd0: 74 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70  tree p has an op
2fe0: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
2ff0: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
3000: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
3010: 2c 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  , then the BTS_P
3020: 45 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d  ENDING flag.** m
3030: 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c  ay be incorrectl
3040: 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  y cleared..*/.st
3050: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41  atic void clearA
3060: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
3070: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
3080: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
3090: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
30a0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
30b0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
30c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30d0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
30e0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
30f0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
3100: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61  ==*ppIter );.  a
3110: 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
3120: 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  s>0 );..  while(
3130: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
3140: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3150: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
3160: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
3170: 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53  ags & BTS_EXCLUS
3180: 49 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  IVE)==0 || pBt->
3190: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
31a0: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
31b0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
31c0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
31d0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
31e0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
31f0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
3200: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
3210: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3220: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3230: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3240: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3250: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3260: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3270: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3280: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
3290: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32a0: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
32b0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
32c0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
32d0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
32e0: 54 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c  TS_PENDING)==0 |
32f0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
3300: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
3310: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
3320: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3330: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
3340: 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c  gs &= ~(BTS_EXCL
3350: 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e  USIVE|BTS_PENDIN
3360: 47 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  G);.  }else if( 
3370: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3380: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
3390: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
33a0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
33b0: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
33c0: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
33d0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
33e0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
33f0: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
3400: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
3410: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
3420: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3430: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3440: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3450: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3460: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3470: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3480: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
3490: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
34a0: 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47   the BTS_PENDING
34b0: 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20   flag to 0..    
34c0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
34d0: 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  re is not curren
34e0: 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68  tly a writer, th
34f0: 65 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d  en BTS_PENDING m
3500: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3510: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3520: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3530: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3540: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3550: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3560: 20 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47   &= ~BTS_PENDING
3570: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3580: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61  his function cha
3590: 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c  nges all write-l
35a0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72  ocks held by Btr
35b0: 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c  ee p into read-l
35c0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
35d0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
35e0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
35f0: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3600: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3610: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3620: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3630: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3640: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3650: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3660: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3670: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3680: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
3690: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  .    for(pLock=p
36a0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
36b0: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
36c0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
36d0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ert( pLock->eLoc
36e0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
36f0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
3700: 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   );.      pLock-
3710: 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  >eLock = READ_LO
3720: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  CK;.    }.  }.}.
3730: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3740: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3750: 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  CHE */..static v
3760: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
3770: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b  MemPage *pPage);
3780: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66    /* Forward ref
3790: 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  erence */../*.**
37a0: 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  *** This routine
37b0: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
37c0: 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79  of assert() only
37d0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69   ****.**.** Veri
37e0: 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  fy that the curs
37f0: 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74  or holds the mut
3800: 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72  ex on its BtShar
3810: 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ed.*/.#ifdef SQL
3820: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
3830: 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73   int cursorHolds
3840: 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a  Mutex(BtCursor *
3850: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
3860: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3870: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  p->pBt->mutex);.
3880: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
3890: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
38a0: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e  NCRBLOB./*.** In
38b0: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
38c0: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
38d0: 63 61 63 68 65 20 66 6f 72 20 63 75 72 73 6f 72  cache for cursor
38e0: 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a   pCur, if any..*
38f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3900: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
3910: 43 61 63 68 65 28 42 74 43 75 72 73 6f 72 20 2a  Cache(BtCursor *
3920: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
3930: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3940: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
3950: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
3960: 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43  aOverflow);.  pC
3970: 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
3980: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  0;.}../*.** Inva
3990: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
39a0: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
39b0: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
39c0: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
39d0: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
39e0: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
39f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3a00: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
3a10: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
3a20: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
3a30: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
3a40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3a50: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
3a60: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
3a70: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
3a80: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
3a90: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3aa0: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
3ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3ac0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
3ad0: 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
3ae0: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
3af0: 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20  f a table.** to 
3b00: 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69  invalidate any i
3b10: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
3b20: 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e  that are open on
3b30: 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f   the.** row or o
3b40: 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62  ne of the rows b
3b50: 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  eing modified..*
3b60: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
3b70: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73   isClearTable is
3b80: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
3b90: 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
3ba0: 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  of the.** table 
3bb0: 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64  is about to be d
3bc0: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
3bd0: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20  case invalidate 
3be0: 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20  all incrblob.** 
3bf0: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
3c00: 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74  any row within t
3c10: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
3c20: 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74  ot-page pgnoRoot
3c30: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
3c40: 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69  e, if argument i
3c50: 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66  sClearTable is f
3c60: 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72  alse, then the r
3c70: 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64  ow with.** rowid
3c80: 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72   iRow is being r
3c90: 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74  eplaced or delet
3ca0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3cb0: 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f   invalidate.** o
3cc0: 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c  nly those incrbl
3cd0: 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ob cursors open 
3ce0: 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66 69 63  on that specific
3cf0: 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
3d00: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49  void invalidateI
3d10: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a  ncrblobCursors(.
3d20: 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c    Btree *pBtree,
3d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3d40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
3d50: 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34  o check */.  i64
3d60: 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20   iRow,          
3d70: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69       /* The rowi
3d80: 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  d that might be 
3d90: 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e  changing */.  in
3da0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20  t isClearTable  
3db0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3dc0: 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65   all rows are be
3dd0: 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29  ing deleted */.)
3de0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3df0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3e00: 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a   = pBtree->pBt;.
3e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
3e30: 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f  (pBtree) );.  fo
3e40: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3e50: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3e60: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49  {.    if( p->isI
3e70: 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
3e80: 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c   (isClearTable |
3e90: 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  | p->info.nKey==
3ea0: 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 70  iRow) ){.      p
3eb0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
3ec0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d  R_INVALID;.    }
3ed0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20  .  }.}..#else.  
3ee0: 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e  /* Stub function
3ef0: 73 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20  s when INCRBLOB 
3f00: 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  is omitted */.  
3f10: 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61  #define invalida
3f20: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3f30: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
3f40: 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
3f50: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
3f60: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
3f70: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78  ncrblobCursors(x
3f80: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
3f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
3fa0: 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  BLOB */../*.** S
3fb0: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
3fc0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
3fd0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
3fe0: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
3ff0: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
4000: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
4010: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
4020: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
4030: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
4040: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
4050: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4060: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
4070: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
4080: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
4090: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
40a0: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
40b0: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
40c0: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
40d0: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
40e0: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
40f0: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
4100: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
4110: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
4120: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
4130: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
4140: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
4150: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
4160: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4170: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
4180: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
4190: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
41a0: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
41b0: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
41c0: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
41d0: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
41e0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
41f0: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
4200: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
4210: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
4220: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
4230: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
4240: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4250: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
4260: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
4270: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
4280: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4290: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
42a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
42b0: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
42c0: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
42d0: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
42e0: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
42f0: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
4300: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
4310: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
4320: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
4330: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
4340: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
4350: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
4360: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
4370: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
4380: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
4390: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
43a0: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
43b0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
43c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
43d0: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
43e0: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
43f0: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
4400: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
4410: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4420: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
4430: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
4440: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
4450: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4460: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4470: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
4480: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
4490: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
44a0: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
44b0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
44c0: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
44d0: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
44e0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
44f0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
4500: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
4510: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
4520: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
4530: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4540: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
4550: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
4560: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
4570: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4580: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
4590: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
45a0: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
45b0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
45c0: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
45d0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
45e0: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
45f0: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
4600: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
4610: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4620: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
4630: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
4640: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
4650: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4660: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
4670: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
4680: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
4690: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
46a0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
46b0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
46c0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
46d0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
46e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
46f0: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
4700: 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
4710: 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50  t( pgno<=pBt->nP
4720: 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age );.    pBt->
4730: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
4740: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
4750: 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  e(pBt->nPage);. 
4760: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4770: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4780: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4790: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
47a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
47b0: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
47c0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
47d0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
47e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
47f0: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4800: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4810: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4820: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4830: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
4840: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
4850: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4860: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4870: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4880: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4890: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
48a0: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
48b0: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
48c0: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
48d0: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
48e0: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
48f0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4900: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4910: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4920: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4930: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
4940: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
4950: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4960: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4970: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4980: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4990: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
49a0: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
49b0: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
49c0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
49d0: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
49e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
49f0: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4a00: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4a10: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4a20: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4a30: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
4a40: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
4a50: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4a60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4a70: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4a80: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4a90: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4aa0: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4ab0: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4ac0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4ad0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
4ae0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
4af0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
4b00: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
4b10: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
4b20: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
4b30: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
4b40: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
4b50: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
4b60: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
4b70: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
4b80: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
4b90: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
4ba0: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
4bb0: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
4bc0: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
4bd0: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
4be0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
4bf0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
4c00: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4c10: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
4c20: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
4c30: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b  =pCur->eState );
4c40: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43  .  assert( 0==pC
4c50: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73  ur->pKey );.  as
4c60: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
4c70: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
4c80: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
4c90: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
4ca0: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
4cb0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
4cc0: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
4cd0: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
4ce0: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
4cf0: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
4d00: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
4d10: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
4d20: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
4d30: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
4d40: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
4d50: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
4d60: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
4d70: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
4d80: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
4d90: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
4da0: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
4db0: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
4dc0: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
4dd0: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
4de0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
4df0: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
4e00: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
4e10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
4e20: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
4e30: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f  intKey ){.    vo
4e40: 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  id *pKey = sqlit
4e50: 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70  e3Malloc( (int)p
4e60: 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20  Cur->nKey );.   
4e70: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
4e80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4e90: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
4ea0: 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79   (int)pCur->nKey
4eb0: 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69  , pKey);.      i
4ec0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4ed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
4ee0: 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20  ->pKey = pKey;. 
4ef0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4f00: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4f10: 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  (pKey);.      }.
4f20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4f30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4f40: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
4f50: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61  assert( !pCur->a
4f60: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
4f70: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
4f80: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
4f90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
4fa0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
4fb0: 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
4fc0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
4fd0: 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
4fe0: 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
4ff0: 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
5000: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
5010: 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
5020: 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  -1;.    pCur->eS
5030: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45  tate = CURSOR_RE
5040: 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a  QUIRESEEK;.  }..
5050: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
5060: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
5070: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5080: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
5090: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
50a0: 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74   cursors (except
50b0: 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61   pExcept) that a
50c0: 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  re open on.** th
50d0: 65 20 74 61 62 6c 65 20 20 77 69 74 68 20 72 6f  e table  with ro
50e0: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55  ot-page iRoot. U
50f0: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
5100: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5110: 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78  re cursor.** pEx
5120: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
5130: 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65  modify the table
5140: 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20   (BtreeDelete() 
5150: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
5160: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
5170: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
5180: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
5190: 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72  gno iRoot, BtCur
51a0: 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20  sor *pExcept){. 
51b0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
51c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
51d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
51e0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
51f0: 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c  rt( pExcept==0 |
5200: 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d  | pExcept->pBt==
5210: 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  pBt );.  for(p=p
5220: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
5230: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
5240: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
5250: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
5260: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
5270: 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  ot) && .        
5280: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
5290: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
52a0: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
52b0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
52c0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
52d0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
52e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
52f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5300: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5310: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
5320: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
5330: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
5340: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5350: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
5360: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5370: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
5380: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5390: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
53a0: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
53b0: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
53c0: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
53d0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
53e0: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
53f0: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
5400: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
5410: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
5420: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
5430: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
5440: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
5450: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
5460: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
5470: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
5480: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
5490: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
54a0: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
54b0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
54c0: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
54d0: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
54e0: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
54f0: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
5500: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
5510: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
5520: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
5530: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
5540: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
5550: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
5560: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
5570: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
5580: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
5590: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
55a0: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
55b0: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
55c0: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
55d0: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
55e0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
55f0: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
5600: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
5610: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
5620: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
5630: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
5640: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
5650: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
5660: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
5670: 63 68 61 72 20 61 53 70 61 63 65 5b 31 35 30 5d  char aSpace[150]
5680: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
5690: 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64  mp space for pId
56a0: 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20  xKey - to avoid 
56b0: 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68  a malloc */.  ch
56c0: 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a  ar *pFree = 0;..
56d0: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
56e0: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d    assert( nKey==
56f0: 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29  (i64)(int)nKey )
5700: 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  ;.    pIdxKey = 
5710: 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
5720: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
5730: 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b          pCur->pK
5740: 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20  eyInfo, aSpace, 
5750: 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29 2c 20  sizeof(aSpace), 
5760: 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a 20 20  &pFree.    );.  
5770: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
5780: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5790: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69  _NOMEM;.    sqli
57a0: 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
57b0: 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
57c0: 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
57d0: 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
57e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78   }else{.    pIdx
57f0: 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
5800: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
5810: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
5820: 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b  Cur, pIdxKey, nK
5830: 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b  ey, bias, pRes);
5840: 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a  .  if( pFree ){.
5850: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5860: 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  e(pCur->pKeyInfo
5870: 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20  ->db, pFree);.  
5880: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
5890: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
58a0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
58b0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
58c0: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
58d0: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
58e0: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
58f0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
5900: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
5910: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
5920: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
5930: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
5940: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
5950: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5960: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
5970: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
5980: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
5990: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
59a0: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
59b0: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
59c0: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
59d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
59e0: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
59f0: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
5a00: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5a10: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5a20: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5a30: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
5a40: 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
5a50: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5a60: 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
5a70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
5a80: 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
5a90: 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
5aa0: 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  t;.  }.  pCur->e
5ab0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
5ac0: 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62  NVALID;.  rc = b
5ad0: 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
5ae0: 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75   pCur->pKey, pCu
5af0: 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75  r->nKey, 0, &pCu
5b00: 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  r->skipNext);.  
5b10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5b20: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
5b30: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
5b40: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
5b50: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
5b60: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
5b70: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
5b80: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5b90: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
5ba0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5bb0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
5bc0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5bd0: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
5be0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5bf0: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
5c00: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
5c10: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5c20: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
5c30: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
5c40: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
5c50: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
5c60: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
5c70: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
5c80: 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
5c90: 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73  placed at.  Curs
5ca0: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
5cb0: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
5cc0: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
5cd0: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
5ce0: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
5cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5d00: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
5d10: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
5d20: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
5d30: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
5d40: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
5d50: 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20  s set to one if 
5d60: 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  the cursor has m
5d70: 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f  oved and 0 if no
5d80: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5d90: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
5da0: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
5db0: 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f  Cur, int *pHasMo
5dc0: 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
5dd0: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
5de0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
5df0: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
5e00: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
5e10: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
5e20: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
5e30: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
5e40: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
5e50: 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20 29 7b  ->skipNext!=0 ){
5e60: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
5e70: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
5e80: 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30    *pHasMoved = 0
5e90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
5ea0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
5eb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5ec0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
5ed0: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
5ee0: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
5ef0: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
5f00: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
5f10: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
5f20: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
5f30: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
5f40: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
5f50: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
5f60: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
5f70: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
5f80: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
5f90: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
5fa0: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
5fb0: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
5fc0: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
5fd0: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
5fe0: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
5ff0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
6000: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
6010: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
6020: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
6030: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
6040: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
6050: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
6060: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
6070: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
6080: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6090: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
60a0: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
60b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
60c0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
60d0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
60e0: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
60f0: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
6100: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
6110: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
6120: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
6130: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
6140: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
6150: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
6160: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
6170: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
6180: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
6190: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
61a0: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
61b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
61c0: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
61d0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
61e0: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
61f0: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
6200: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
6210: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
6220: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
6230: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
6240: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
6250: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
6260: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
6270: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
6280: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
6290: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
62a0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
62b0: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
62c0: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
62d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
62e0: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
62f0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
6300: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
6310: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
6320: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
6330: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
6340: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6350: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
6360: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
6370: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
6380: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
6390: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
63a0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
63b0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
63c0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
63d0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
63e0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
63f0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6400: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
6410: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
6420: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
6430: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
6440: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
6450: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
6460: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
6470: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
6480: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
6490: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
64a0: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
64b0: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
64c0: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
64d0: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
64e0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
64f0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
6500: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
6510: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
6520: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
6530: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6540: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6550: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
6560: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
6570: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
6580: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
6590: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
65a0: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
65b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
65c0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
65d0: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
65e0: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
65f0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
6600: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
6610: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
6620: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
6630: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6640: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
6650: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73  _exit;.  }.  ass
6660: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
6670: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
6680: 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d  ize-5 );.  pPtrm
6690: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
66a0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
66b0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
66c0: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
66d0: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
66e0: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
66f0: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
6700: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
6710: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
6720: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
6730: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
6740: 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20  );.    *pRC= rc 
6750: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
6760: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
6770: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6780: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
6790: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
67a0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
67b0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
67c0: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
67d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72  ;.    }.  }..ptr
67e0: 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  map_exit:.  sqli
67f0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
6800: 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bPage);.}../*.**
6810: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
6820: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
6830: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
6840: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
6850: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
6860: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
6870: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
6880: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
6890: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
68a0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
68b0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
68c0: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
68d0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
68e0: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
68f0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
6900: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
6910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6920: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
6930: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
6940: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
6950: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
6960: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
6970: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
6980: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
6990: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
69a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
69b0: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
69c0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
69d0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
69e0: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
69f0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
6a00: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
6a10: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
6a20: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
6a30: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
6a40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6a50: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
6a60: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
6a70: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
6a80: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
6a90: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
6aa0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
6ab0: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
6ac0: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
6ad0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
6ae0: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
6af0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
6b00: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
6b10: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
6b20: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
6b30: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
6b40: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
6b50: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
6b60: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
6b70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6b80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6b90: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6ba0: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
6bb0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
6bc0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
6bd0: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
6be0: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
6bf0: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
6c00: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
6c10: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
6c20: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
6c30: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
6c40: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
6c50: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
6c60: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
6c70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6c80: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  PT;.  return SQL
6c90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
6ca0: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
6cb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
6cc0: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
6cd0: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
6ce0: 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69  ,y,z,rc).  #defi
6cf0: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
6d00: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
6d10: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
6d20: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c  PutOvflPtr(x, y,
6d30: 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   rc).#endif../*.
6d40: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
6d50: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
6d60: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
6d70: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
6d80: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
6d90: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
6da0: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
6db0: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
6dc0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
6dd0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
6de0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6df0: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
6e00: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
6e10: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
6e20: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
6e30: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
6e40: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
6e50: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
6e60: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28  Page & get2byte(
6e70: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
6e80: 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65  *(I)]))).#define
6e90: 20 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c   findCellv2(D,M,
6ea0: 4f 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32 62  O,I) (D+(M&get2b
6eb0: 79 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29  yte(D+(O+2*(I)))
6ec0: 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  )).../*.** This 
6ed0: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76  a more complex v
6ee0: 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65  ersion of findCe
6ef0: 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20  ll() that works 
6f00: 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61  for.** pages tha
6f10: 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65  t do contain ove
6f20: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
6f30: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f  static u8 *findO
6f40: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50  verflowCell(MemP
6f50: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
6f60: 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  iCell){.  int i;
6f70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6f80: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
6f90: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
6fa0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67   );.  for(i=pPag
6fb0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20  e->nOverflow-1; 
6fc0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
6fd0: 69 6e 74 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 70  int k;.    k = p
6fe0: 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b  Page->aiOvfl[i];
6ff0: 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c  .    if( k<=iCel
7000: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b  l ){.      if( k
7010: 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==iCell ){.     
7020: 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d     return pPage-
7030: 3e 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20  >apOvfl[i];.    
7040: 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d    }.      iCell-
7050: 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  -;.    }.  }.  r
7060: 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70  eturn findCell(p
7070: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a  Page, iCell);.}.
7080: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  ./*.** Parse a c
7090: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
70a0: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
70b0: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
70c0: 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ture.  There.** 
70d0: 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
70e0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
70f0: 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65 43 65  n.  btreeParseCe
7100: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a  ll() takes a .**
7110: 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74   cell index as t
7120: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
7130: 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61 72 73  nt and btreePars
7140: 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74  eCellPtr() .** t
7150: 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  akes a pointer t
7160: 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
7170: 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65  e cell as its se
7180: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
7190: 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73  *.** Within this
71a0: 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65   file, the parse
71b0: 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e  Cell() macro can
71c0: 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
71d0: 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61  ad of.** btreePa
71e0: 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73  rseCellPtr(). Us
71f0: 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  ing some compile
7200: 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  rs, this will be
7210: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   faster..*/.stat
7220: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
7230: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
7240: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
7250: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
7260: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
7270: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7290: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
72a0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
72b0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
72c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
72d0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
72e0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b  e */.){.  u16 n;
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7300: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
7310: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
7320: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
7330: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
7340: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7350: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
7360: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
7370: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7380: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
7390: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
73a0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
73b0: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
73c0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
73d0: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
73e0: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
73f0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
7400: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
7410: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
7420: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
7430: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
7440: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
7450: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65  ){.      n += ge
7460: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
7470: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
7480: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7490: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
74a0: 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65     }.    n += ge
74b0: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
74c0: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
74d0: 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66  >nKey);.    pInf
74e0: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
74f0: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
7500: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
7510: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   0;.    n += get
7520: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
7530: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
7540: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
7550: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
7560: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
7570: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
7580: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
7590: 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  n;.  testcase( n
75a0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
75b0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
75c0: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
75d0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
75e0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b  l+1 );.  if( lik
75f0: 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  ely(nPayload<=pP
7600: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29  age->maxLocal) )
7610: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
7620: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
7630: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
7640: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
7650: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
7660: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
7670: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
7680: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
7690: 0a 20 20 20 20 69 66 28 20 28 70 49 6e 66 6f 2d  .    if( (pInfo-
76a0: 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 28 6e  >nSize = (u16)(n
76b0: 2b 6e 50 61 79 6c 6f 61 64 29 29 3c 34 20 29 20  +nPayload))<4 ) 
76c0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
76d0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
76e0: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
76f0: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
7700: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
7710: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
7720: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
7730: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
7740: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
7750: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
7760: 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  .    ** to decid
7770: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
7780: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
7790: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
77a0: 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76  l onto.    ** ov
77b0: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
77c0: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
77d0: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
77e0: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
77f0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20      ** space on 
7800: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
7810: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
7820: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
7830: 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20   storage.    ** 
7840: 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f  in between minLo
7850: 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c  cal and maxLocal
7860: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
7870: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
7880: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
7890: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
78a0: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
78b0: 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c  y.    ** way wil
78c0: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
78d0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
78e0: 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a   format..    */.
78f0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
7900: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
7910: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
7920: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7930: 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c      int maxLocal
7940: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
7950: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
7960: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7970: 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b      int surplus;
7980: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
7990: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
79a0: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
79b0: 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f  ge */..    minLo
79c0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
79d0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f  Local;.    maxLo
79e0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
79f0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c  Local;.    surpl
7a00: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
7a10: 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  (nPayload - minL
7a20: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
7a30: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
7a40: 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
7a50: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
7a60: 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  cal );.    testc
7a70: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
7a80: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
7a90: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
7aa0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
7ab0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
7ac0: 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20   (u16)surplus;. 
7ad0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7ae0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
7af0: 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  (u16)minLocal;. 
7b00: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
7b10: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36  iOverflow = (u16
7b20: 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20  )(pInfo->nLocal 
7b30: 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  + n);.    pInfo-
7b40: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
7b50: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
7b60: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72   }.}.#define par
7b70: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
7b80: 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20  ell, pInfo) \.  
7b90: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7ba0: 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43  r((pPage), findC
7bb0: 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43  ell((pPage), (iC
7bc0: 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a  ell)), (pInfo)).
7bd0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
7be0: 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65  eParseCell(.  Me
7bf0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
7c00: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
7c10: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
7c20: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
7c30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7c40: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
7c50: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
7c60: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
7c70: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
7c80: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
7c90: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
7ca0: 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67    parseCell(pPag
7cb0: 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, iCell, pInfo)
7cc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
7cd0: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  te the total num
7ce0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61  ber of bytes tha
7cf0: 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69  t a Cell needs i
7d00: 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  n the cell.** da
7d10: 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62  ta area of the b
7d20: 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20  tree-page.  The 
7d30: 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e  return number in
7d40: 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a  cludes the cell.
7d50: 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61  ** data header a
7d60: 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79  nd the local pay
7d70: 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e  load, but not an
7d80: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  y overflow page 
7d90: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20  or.** the space 
7da0: 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c  used by the cell
7db0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
7dc0: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
7dd0: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
7de0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
7df0: 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70    u8 *pIter = &p
7e00: 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c  Cell[pPage->chil
7e10: 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32  dPtrSize];.  u32
7e20: 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20   nSize;..#ifdef 
7e30: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
7e40: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
7e50: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
7e60: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
7e70: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
7e80: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
7e90: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
7ea0: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
7eb0: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
7ec0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
7ed0: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
7ee0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
7ef0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
7f00: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
7f10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
7f20: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
7f30: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
7f40: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
7f50: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
7f60: 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  fo;.  btreeParse
7f70: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
7f80: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
7f90: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
7fa0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
7fb0: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a  {.    u8 *pEnd;.
7fc0: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
7fd0: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
7fe0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
7ff0: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a  nt32(pIter, nSiz
8000: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
8010: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a       nSize = 0;.
8020: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49      }..    /* pI
8030: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
8040: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
8050: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
8060: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
8070: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
8080: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
8090: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
80a0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
80b0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
80c0: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
80d0: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
80e0: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
80f0: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
8100: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
8110: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
8120: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65  <pEnd );.  }else
8130: 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  {.    pIter += g
8140: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
8150: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  , nSize);.  }.. 
8160: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
8170: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8180: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
8190: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
81a0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
81b0: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
81c0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
81d0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
81e0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
81f0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
8200: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
8210: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
8220: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8230: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
8240: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
8250: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
8260: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8270: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
8280: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
8290: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
82a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
82b0: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
82c0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
82d0: 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  Size += 4;.  }. 
82e0: 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28   nSize += (u32)(
82f0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
8300: 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75  .  /* The minimu
8310: 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65  m size of any ce
8320: 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a  ll is 4 bytes. *
8330: 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20  /.  if( nSize<4 
8340: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  ){.    nSize = 4
8350: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
8360: 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66   nSize==debuginf
8370: 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74  o.nSize );.  ret
8380: 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a  urn (u16)nSize;.
8390: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
83a0: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76  _DEBUG./* This v
83b0: 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c  ariation on cell
83c0: 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65  SizePtr() is use
83d0: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
83e0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a  rt() statements.
83f0: 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74  ** only. */.stat
8400: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28  ic u16 cellSize(
8410: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8420: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65  int iCell){.  re
8430: 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  turn cellSizePtr
8440: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
8450: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b  (pPage, iCell));
8460: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
8470: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
8480: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
8490: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
84a0: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
84b0: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
84c0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
84d0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
84e0: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
84f0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
8500: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
8510: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
8520: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8530: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
8540: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8550: 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a  u8 *pCell, int *
8560: 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  pRC){.  CellInfo
8570: 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52   info;.  if( *pR
8580: 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  C ) return;.  as
8590: 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29  sert( pCell!=0 )
85a0: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
85b0: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
85c0: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
85d0: 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
85e0: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
85f0: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
8600: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
8610: 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
8620: 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e  rflow ){.    Pgn
8630: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
8640: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
8650: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70  verflow]);.    p
8660: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
8670: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
8680: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
8690: 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a  ge->pgno, pRC);.
86a0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
86b0: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
86c0: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
86d0: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
86e0: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
86f0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
8700: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
8710: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
8720: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
8730: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
8740: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
8750: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
8760: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
8770: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
8780: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
8790: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
87a0: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
87b0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
87c0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
87d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
87e0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
87f0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
8800: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
8810: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
8820: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8840: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
8850: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
8860: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8880: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
8890: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
88a0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
88b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
88c0: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
88d0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
88e0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
88f0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8900: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
8910: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
8920: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
8930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8940: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
8950: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
8960: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8980: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
8990: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
89a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
89b0: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
89c0: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
89d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
89e0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
89f0: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
8a00: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
8a10: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
8a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8a30: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
8a40: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
8a50: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
8a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
8a70: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
8a80: 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65  ndex */...  asse
8a90: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
8aa0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
8ab0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
8ac0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8ad0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
8ae0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
8af0: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
8b00: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
8b10: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
8b20: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
8b30: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
8b40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8b50: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8b60: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
8b70: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
8b80: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
8b90: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
8ba0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
8bb0: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
8bc0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
8bd0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
8be0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
8bf0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
8c00: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
8c10: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
8c20: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
8c30: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
8c40: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
8c50: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
8c60: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
8c70: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
8c80: 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d  mcpy(&temp[cbrk]
8c90: 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
8ca0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b  sableSize - cbrk
8cb0: 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  );.  cbrk = usab
8cc0: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
8cd0: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
8ce0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
8cf0: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
8d00: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
8d10: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
8d20: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
8d30: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
8d40: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
8d50: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
8d60: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
8d70: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
8d80: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
8d90: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8da0: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
8db0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8dc0: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
8dd0: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
8de0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8df0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8e00: 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ).    /* These c
8e10: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
8e20: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
8e30: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
8e40: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
8e50: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8e60: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
8e70: 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a  ECK is defined .
8e80: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
8e90: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
8ea0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
8eb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8ec0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8ed0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8ee0: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
8ef0: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
8f00: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
8f10: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
8f20: 65 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d  ePtr(pPage, &tem
8f30: 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  p[pc]);.    cbrk
8f40: 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65   -= size;.#if de
8f50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
8f60: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
8f70: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28  L_CHECK).    if(
8f80: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
8f90: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8fa0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8fb0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  BKPT;.    }.#els
8fc0: 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  e.    if( cbrk<i
8fd0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
8fe0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
8ff0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9000: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9010: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  KPT;.    }.#endi
9020: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  f.    assert( cb
9030: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
9040: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
9050: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
9060: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
9070: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
9080: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
9090: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
90a0: 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ize );.    memcp
90b0: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
90c0: 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  temp[pc], size);
90d0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
90e0: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a  ddr, cbrk);.  }.
90f0: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
9100: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
9110: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
9120: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
9130: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
9140: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
9150: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
9160: 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  ] = 0;.  memset(
9170: 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74  &data[iCellFirst
9180: 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c  ], 0, cbrk-iCell
9190: 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74  First);.  assert
91a0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
91b0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
91c0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
91d0: 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  f( cbrk-iCellFir
91e0: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
91f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9200: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9210: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
9220: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
9230: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
9240: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
9250: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
9260: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
9270: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
9280: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
9290: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
92a0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
92b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
92c0: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
92d0: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
92e0: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
92f0: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
9300: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
9310: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
9320: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
9330: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
9340: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
9350: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
9360: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
9370: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
9380: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
9390: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
93a0: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
93b0: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
93c0: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
93d0: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
93e0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
93f0: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
9400: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
9410: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
9420: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
9430: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
9440: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
9450: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
9460: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
9470: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
9480: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
9490: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
94a0: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
94b0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
94c0: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
94d0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
94e0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
94f0: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
9500: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
9510: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
9520: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
9530: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
9540: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
9550: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
9560: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
9570: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
9580: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
9590: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20  /.  int nFrag;  
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
95c0: 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  er of fragmented
95d0: 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20   bytes on pPage 
95e0: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
9610: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
9620: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
9630: 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20    int gap;      
9640: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9650: 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63  of gap between c
9660: 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell pointers and
9670: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
9680: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
9690: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
96a0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
96b0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f  nt usableSize; /
96c0: 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
96d0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a   the page */.  .
96e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
96f0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
9700: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
9710: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9720: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
9730: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9740: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9750: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9760: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
9770: 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =0 );  /* Minimu
9780: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
9790: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
97a0: 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74  age->nFree>=nByt
97b0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
97c0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
97d0: 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  =0 );.  usableSi
97e0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
97f0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61  >usableSize;.  a
9800: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75  ssert( nByte < u
9810: 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a  sableSize-8 );..
9820: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
9830: 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28  dr+7];.  assert(
9840: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9850: 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d  et == hdr + 12 -
9860: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29   4*pPage->leaf )
9870: 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d  ;.  gap = pPage-
9880: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
9890: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
98a0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
98b0: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
98c0: 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74  5]);.  if( gap>t
98d0: 6f 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  op ) return SQLI
98e0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
98f0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
9900: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
9910: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
9920: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
9930: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20   gap==top );..  
9940: 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b  if( nFrag>=60 ){
9950: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 64  .    /* Always d
9960: 65 66 72 61 67 6d 65 6e 74 20 68 69 67 68 6c 79  efragment highly
9970: 20 66 72 61 67 6d 65 6e 74 65 64 20 70 61 67 65   fragmented page
9980: 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 64 65  s */.    rc = de
9990: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
99a0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
99b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
99c0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
99d0: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
99e0: 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  +5]);.  }else if
99f0: 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a  ( gap+2<=top ){.
9a00: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68      /* Search th
9a10: 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69  e freelist looki
9a20: 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c  ng for a free sl
9a30: 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ot big enough to
9a40: 20 73 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a   satisfy .    **
9a50: 20 74 68 65 20 72 65 71 75 65 73 74 2e 20 54 68   the request. Th
9a60: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
9a70: 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69  made from the fi
9a80: 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e  rst free slot in
9a90: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73   .    ** the lis
9aa0: 74 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 20  t that is large 
9ab0: 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 61  enough to accoma
9ac0: 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  date it..    */.
9ad0: 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72      int pc, addr
9ae0: 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68  ;.    for(addr=h
9af0: 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32  dr+1; (pc = get2
9b00: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
9b10: 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a  ))>0; addr=pc){.
9b20: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20        int size; 
9b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9b40: 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73  ze of the free s
9b50: 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  lot */.      if(
9b60: 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34   pc>usableSize-4
9b70: 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20 29 7b   || pc<addr+4 ){
9b80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9b90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9ba0: 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
9bb0: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
9bc0: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
9bd0: 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e  .      if( size>
9be0: 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  =nByte ){.      
9bf0: 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d    int x = size -
9c00: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
9c10: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29  testcase( x==4 )
9c20: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
9c30: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
9c40: 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20      if( x<4 ){. 
9c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f           /* Remo
9c60: 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d  ve the slot from
9c70: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
9c80: 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65  Update the numbe
9c90: 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a  r of.          *
9ca0: 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  * fragmented byt
9cb0: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
9cc0: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ge. */.         
9cd0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64   memcpy(&data[ad
9ce0: 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20  dr], &data[pc], 
9cf0: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61  2);.          da
9d00: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38 29  ta[hdr+7] = (u8)
9d10: 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20 20 20  (nFrag + x);.   
9d20: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
9d30: 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53  ize+pc > usableS
9d40: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
9d50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9d60: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9d70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9d80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
9d90: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
9da0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
9db0: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
9dc0: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
9dd0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74   ** for the port
9de0: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
9df0: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
9e00: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  */.          put
9e10: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
9e20: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  ], x);.        }
9e30: 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78 20 3d  .        *pIdx =
9e40: 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20   pc + x;.       
9e50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9e60: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
9e70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
9e80: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
9e90: 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70  ere is enough sp
9ea0: 61 63 65 20 69 6e 20 74 68 65 20 67 61 70 20 74  ace in the gap t
9eb0: 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a 20 74  o satisfy.  ** t
9ec0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  he allocation.  
9ed0: 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65  If not, defragme
9ee0: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  nt..  */.  testc
9ef0: 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65  ase( gap+2+nByte
9f00: 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67  ==top );.  if( g
9f10: 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29  ap+2+nByte>top )
9f20: 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61  {.    rc = defra
9f30: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
9f40: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
9f50: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f  eturn rc;.    to
9f60: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
9f70: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
9f80: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
9f90: 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b  ap+nByte<=top );
9fa0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  .  }...  /* Allo
9fb0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
9fc0: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
9fd0: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
9fe0: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
9ff0: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
a000: 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20  tent area.  The 
a010: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
a020: 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79  call has already
a030: 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20  .  ** validated 
a040: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47  the freelist.  G
a050: 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72  iven that the fr
a060: 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c  eelist is valid,
a070: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e   there.  ** is n
a080: 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61  o way that the a
a090: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78  llocation can ex
a0a0: 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64  tend off the end
a0b0: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20   of the page..  
a0c0: 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20  ** The assert() 
a0d0: 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
a0e0: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
a0f0: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  ence..  */.  top
a100: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74   -= nByte;.  put
a110: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
a120: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65  5], top);.  asse
a130: 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d  rt( top+nByte <=
a140: 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
a150: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
a160: 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20    *pIdx = top;. 
a170: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a180: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
a190: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
a1a0: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
a1b0: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
a1c0: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
a1d0: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
a1e0: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
a1f0: 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d  ge->aDisk[start]
a200: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
a210: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
a220: 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a   "size" bytes..*
a230: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
a240: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
a250: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
a260: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
a270: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
a280: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
a290: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
a2a0: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
a2b0: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
a2c0: 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69  ge, int start, i
a2d0: 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20  nt size){.  int 
a2e0: 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64  addr, pbegin, hd
a2f0: 72 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 3b 20  r;.  int iLast; 
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73         /* Larges
a320: 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62  t possible freeb
a330: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
a340: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
a350: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
a360: 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ata;..  assert( 
a370: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
a380: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a390: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
a3a0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
a3b0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
a3c0: 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64  start>=pPage->hd
a3d0: 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d  rOffset+6+pPage-
a3e0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b  >childPtrSize );
a3f0: 0a 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72  .  assert( (star
a400: 74 20 2b 20 73 69 7a 65 29 20 3c 3d 20 28 69 6e  t + size) <= (in
a410: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
a420: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73  ableSize );.  as
a430: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a440: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
a450: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
a460: 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30   assert( size>=0
a470: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
a480: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
a490: 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  */..  if( pPage-
a4a0: 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
a4b0: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
a4c0: 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65  TE ){.    /* Ove
a4d0: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
a4e0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
a4f0: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73  zeros when the s
a500: 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20  ecure_delete.   
a510: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
a520: 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  abled */.    mem
a530: 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d  set(&data[start]
a540: 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a  , 0, size);.  }.
a550: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70  .  /* Add the sp
a560: 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ace back into th
a570: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
a580: 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f   freeblocks.  No
a590: 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 65 76 65  te that.  ** eve
a5a0: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65  n though the fre
a5b0: 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20  eblock list was 
a5c0: 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65  checked by btree
a5d0: 49 6e 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a  InitPage(),.  **
a5e0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
a5f0: 20 64 69 64 20 6e 6f 74 20 64 65 74 65 63 74 20   did not detect 
a600: 6f 76 65 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c  overlapping cell
a610: 73 20 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c  s or.  ** freebl
a620: 6f 63 6b 73 20 74 68 61 74 20 6f 76 65 72 6c 61  ocks that overla
a630: 70 70 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f  pped cells.   No
a640: 72 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74  r does it detect
a650: 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63   when the.  ** c
a660: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
a670: 20 65 78 63 65 65 64 73 20 74 68 65 20 76 61 6c   exceeds the val
a680: 75 65 20 69 6e 20 74 68 65 20 70 61 67 65 20 68  ue in the page h
a690: 65 61 64 65 72 2e 20 20 49 66 20 74 68 65 73 65  eader.  If these
a6a0: 0a 20 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73  .  ** situations
a6b0: 20 61 72 69 73 65 2c 20 74 68 65 6e 20 73 75 62   arise, then sub
a6c0: 73 65 71 75 65 6e 74 20 69 6e 73 65 72 74 20 6f  sequent insert o
a6d0: 70 65 72 61 74 69 6f 6e 73 20 6d 69 67 68 74 20  perations might 
a6e0: 63 6f 72 72 75 70 74 0a 20 20 2a 2a 20 74 68 65  corrupt.  ** the
a6f0: 20 66 72 65 65 6c 69 73 74 2e 20 20 53 6f 20 77   freelist.  So w
a700: 65 20 64 6f 20 6e 65 65 64 20 74 6f 20 63 68 65  e do need to che
a710: 63 6b 20 66 6f 72 20 63 6f 72 72 75 70 74 69 6f  ck for corruptio
a720: 6e 20 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67  n while scanning
a730: 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69  .  ** the freeli
a740: 73 74 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  st..  */.  hdr =
a750: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
a760: 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20  t;.  addr = hdr 
a770: 2b 20 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70  + 1;.  iLast = p
a780: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a790: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73  eSize - 4;.  ass
a7a0: 65 72 74 28 20 73 74 61 72 74 3c 3d 69 4c 61 73  ert( start<=iLas
a7b0: 74 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  t );.  while( (p
a7c0: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
a7d0: 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73  (&data[addr]))<s
a7e0: 74 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30  tart && pbegin>0
a7f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 62 65 67   ){.    if( pbeg
a800: 69 6e 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20  in<addr+4 ){.   
a810: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a820: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a830: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20     }.    addr = 
a840: 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66  pbegin;.  }.  if
a850: 28 20 70 62 65 67 69 6e 3e 69 4c 61 73 74 20 29  ( pbegin>iLast )
a860: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a870: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a880: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a890: 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70  pbegin>addr || p
a8a0: 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75  begin==0 );.  pu
a8b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
a8c0: 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75  r], start);.  pu
a8d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
a8e0: 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20  rt], pbegin);.  
a8f0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
a900: 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a  tart+2], size);.
a910: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
a920: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20   pPage->nFree + 
a930: 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a  (u16)size;..  /*
a940: 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65   Coalesce adjace
a950: 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a  nt free blocks *
a960: 2f 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  /.  addr = hdr +
a970: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
a980: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
a990: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20  &data[addr]))>0 
a9a0: 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74  ){.    int pnext
a9b0: 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20  , psize, x;.    
a9c0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
a9d0: 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ddr );.    asser
a9e0: 74 28 20 70 62 65 67 69 6e 20 3c 3d 20 28 69 6e  t( pbegin <= (in
a9f0: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
aa00: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
aa10: 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79    pnext = get2by
aa20: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  te(&data[pbegin]
aa30: 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67  );.    psize = g
aa40: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
aa50: 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66  egin+2]);.    if
aa60: 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65  ( pbegin + psize
aa70: 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26   + 3 >= pnext &&
aa80: 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20   pnext>0 ){.    
aa90: 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65    int frag = pne
aaa0: 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69  xt - (pbegin+psi
aab0: 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  ze);.      if( (
aac0: 66 72 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67  frag<0) || (frag
aad0: 3e 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37  >(int)data[hdr+7
aae0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
aaf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ab00: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
ab10: 7d 0a 20 20 20 20 20 20 64 61 74 61 5b 68 64 72  }.      data[hdr
ab20: 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b  +7] -= (u8)frag;
ab30: 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62  .      x = get2b
ab40: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d  yte(&data[pnext]
ab50: 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  );.      put2byt
ab60: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  e(&data[pbegin],
ab70: 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70   x);.      x = p
ab80: 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74 65 28  next + get2byte(
ab90: 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20  &data[pnext+2]) 
aba0: 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20  - pbegin;.      
abb0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
abc0: 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20  begin+2], x);.  
abd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
abe0: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
abf0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
ac00: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
ac10: 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69  t area begins wi
ac20: 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20  th a freeblock, 
ac30: 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  remove it. */.  
ac40: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d  if( data[hdr+1]=
ac50: 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20  =data[hdr+5] && 
ac60: 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74  data[hdr+2]==dat
ac70: 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20  a[hdr+6] ){.    
ac80: 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65  int top;.    pbe
ac90: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
aca0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
acb0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68    memcpy(&data[h
acc0: 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65  dr+1], &data[pbe
acd0: 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f  gin], 2);.    to
ace0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
acf0: 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74  ta[hdr+5]) + get
ad00: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
ad10: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32  in+2]);.    put2
ad20: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
ad30: 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61  ], top);.  }.  a
ad40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
ad50: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
ad60: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
ad70: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ad80: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
ad90: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
ada0: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
adb0: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
adc0: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
add0: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
ade0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
adf0: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
ae00: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
ae10: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
ae20: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
ae30: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
ae40: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
ae50: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
ae60: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
ae70: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
ae80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
ae90: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
aea0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
aeb0: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
aec0: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
aed0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
aee0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
aef0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
af00: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
af10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
af20: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
af30: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
af40: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
af50: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
af60: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
af70: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
af80: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
af90: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
afa0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
afb0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
afc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
afd0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
afe0: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
aff0: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
b000: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
b010: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
b020: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
b030: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
b040: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
b050: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
b060: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20  ge->leaf;.  pBt 
b070: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
b080: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
b090: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
b0a0: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
b0b0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
b0c0: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68   1;.    pPage->h
b0d0: 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  asData = pPage->
b0e0: 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  leaf;.    pPage-
b0f0: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
b100: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
b110: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
b120: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
b130: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
b140: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
b150: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
b160: 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  ntKey = 0;.    p
b170: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
b180: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  0;.    pPage->ma
b190: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
b1a0: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
b1b0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
b1c0: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
b1d0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
b1e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b1f0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67  BKPT;.  }.  pPag
b200: 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
b210: 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79  ad = pBt->max1by
b220: 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74  tePayload;.  ret
b230: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b240: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
b250: 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
b260: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
b270: 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
b280: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
b290: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
b2a0: 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61  .  If we see tha
b2b0: 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a  t the page does.
b2c0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
b2d0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
b2e0: 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e  abase page, then
b2f0: 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
b300: 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74  TE_CORRUPT.  Not
b310: 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20  e that a return 
b320: 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65  of SQLITE_OK doe
b330: 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74  s not.** guarant
b340: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
b350: 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e   is well-formed.
b360: 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20    It only shows 
b370: 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65  that.** we faile
b380: 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20  d to detect any 
b390: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
b3a0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
b3b0: 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  nitPage(MemPage 
b3c0: 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65  *pPage){..  asse
b3d0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
b3e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
b3f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b400: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
b410: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
b420: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
b430: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
b440: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
b450: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b460: 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
b470: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
b480: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
b490: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b4a0: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
b4b0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
b4c0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
b4d0: 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  ) );..  if( !pPa
b4e0: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
b4f0: 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20    u16 pc;       
b500: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
b510: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
b520: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
b530: 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68  ta[] */.    u8 h
b540: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
b550: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
b560: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
b570: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ader */.    u8 *
b580: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
b590: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
b5a0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42  ->aData */.    B
b5b0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
b5c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
b5d0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
b5e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62   */.    int usab
b5f0: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
b600: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
b610: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
b620: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c  e */.    u16 cel
b630: 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f  lOffset;    /* O
b640: 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74  ffset from start
b650: 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73   of page to firs
b660: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
b670: 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b  /.    int nFree;
b680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b690: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
b6a0: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
b6b0: 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20  /.    int top;  
b6c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
b6d0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
b6e0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
b6f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
b700: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
b710: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
b720: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
b730: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ffset */.    int
b740: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
b750: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
b760: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
b770: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
b780: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
b790: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
b7a0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
b7b0: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
b7c0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66  e->aData;.    if
b7d0: 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50  ( decodeFlags(pP
b7e0: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20  age, data[hdr]) 
b7f0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
b800: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b810: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
b820: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
b830: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
b840: 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67  5536 );.    pPag
b850: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
b860: 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
b870: 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67  e - 1);.    pPag
b880: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
b890: 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
b8a0: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
b8b0: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63  ze;.    pPage->c
b8c0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c  ellOffset = cell
b8d0: 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31  Offset = hdr + 1
b8e0: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
b8f0: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  f;.    pPage->aD
b900: 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75  ataEnd = &data[u
b910: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20  sableSize];.    
b920: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
b930: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
b940: 65 74 5d 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  et];.    top = g
b950: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
b960: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
b970: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
b980: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b990: 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28  hdr+3]);.    if(
b9a0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
b9b0: 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
b9c0: 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63      /* To many c
b9d0: 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ells for a singl
b9e0: 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  e page.  The pag
b9f0: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
ba00: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
ba10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ba20: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
ba30: 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
ba40: 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c  ->nCell==MX_CELL
ba50: 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  (pBt) );..    /*
ba60: 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
ba70: 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
ba80: 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61   cause us to rea
ba90: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
baa0: 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68     ** of page wh
bab0: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c  en parsing a cel
bac0: 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  l.  .    **.    
bad0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
bae0: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
baf0: 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
bb00: 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
bb10: 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74  ends.    ** past
bb20: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
bb30: 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
bb40: 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
bb50: 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20  RRUPT to be .   
bb60: 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20   ** returned if 
bb70: 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a  it does..    */.
bb80: 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d      iCellFirst =
bb90: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
bba0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
bbb0: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
bbc0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69  ableSize - 4;.#i
bbd0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
bbe0: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
bbf0: 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
bc00: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20   {.      int i; 
bc10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
bc20: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c  dex into the cel
bc30: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
bc40: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  */.      int sz;
bc50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
bc60: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
bc70: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
bc80: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
bc90: 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72  ast--;.      for
bca0: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
bcb0: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
bcc0: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
bcd0: 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  e(&data[cellOffs
bce0: 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  et+i*2]);.      
bcf0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
bd00: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
bd10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
bd20: 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
bd30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c  .        if( pc<
bd40: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
bd50: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
bd60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
bd70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bd80: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
bd90: 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
bda0: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64  izePtr(pPage, &d
bdb0: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
bdc0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
bdd0: 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  z==usableSize );
bde0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 2b  .        if( pc+
bdf0: 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  sz>usableSize ){
be00: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
be10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
be20: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
be30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
be40: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
be50: 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20  ) iCellLast++;. 
be60: 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20     }  .#endif.. 
be70: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
be80: 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61  e total free spa
be90: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ce on the page *
bea0: 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  /.    pc = get2b
beb0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
bec0: 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64  );.    nFree = d
bed0: 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70  ata[hdr+7] + top
bee0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e  ;.    while( pc>
bef0: 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e  0 ){.      u16 n
bf00: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20  ext, size;.     
bf10: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
bf20: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
bf30: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
bf40: 20 53 74 61 72 74 20 6f 66 20 66 72 65 65 20 62   Start of free b
bf50: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
bf60: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
bf70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bf80: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
bf90: 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20     }.      next 
bfa0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
bfb0: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a  [pc]);.      siz
bfc0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
bfd0: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
bfe0: 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20   if( (next>0 && 
bff0: 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29  next<=pc+size+3)
c000: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
c010: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
c020: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73    /* Free blocks
c030: 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65   must be in asce
c040: 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64  nding order. And
c050: 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
c060: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
c070: 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74   free-block must
c080: 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61   lie on the data
c090: 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  base page.  */. 
c0a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c0b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c0c0: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
c0d0: 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
c0e0: 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  + size;.      pc
c0f0: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a   = next;.    }..
c100: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
c110: 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
c120: 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
c130: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
c140: 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f  e start.    ** o
c150: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
c160: 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
c170: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
c180: 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20  bytes within.   
c190: 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
c1a0: 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
c1b0: 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
c1c0: 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
c1d0: 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ze.    ** of the
c1e0: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
c1f0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
c200: 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
c210: 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73  ck also.    ** s
c220: 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20  erves to verify 
c230: 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20  that the offset 
c240: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
c250: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
c260: 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63  .    ** area, ac
c270: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70  cording to the p
c280: 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73  age header, lies
c290: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
c2a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c2b0: 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
c2c0: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
c2d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c2e0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
c2f0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
c300: 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
c310: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20  CellFirst);.    
c320: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
c330: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
c340: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
c350: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
c360: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
c370: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
c380: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
c390: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
c3a0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
c3b0: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
c3c0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
c3d0: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
c3e0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
c3f0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
c400: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
c410: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
c420: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
c430: 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
c440: 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
c450: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
c460: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
c470: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
c480: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
c490: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
c4a0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
c4b0: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
c4c0: 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
c4d0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
c4e0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
c4f0: 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
c500: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
c510: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
c520: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
c530: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
c540: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c550: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
c560: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  );.  if( pBt->bt
c570: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
c580: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
c590: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
c5a0: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
c5b0: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
c5c0: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
c5d0: 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
c5e0: 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38   first = hdr + 8
c5f0: 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46   + 4*((flags&PTF
c600: 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b  _LEAF)==0 ?1:0);
c610: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
c620: 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
c630: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
c640: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
c650: 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
c660: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
c670: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
c680: 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
c690: 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20  ize - first);.  
c6a0: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
c6b0: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
c6c0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
c6d0: 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  hdr;.  pPage->ce
c6e0: 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74  llOffset = first
c6f0: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
c700: 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d  End = &data[pBt-
c710: 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  >usableSize];.  
c720: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
c730: 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a  = &data[first];.
c740: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
c750: 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
c760: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
c770: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
c780: 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
c790: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
c7a0: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
c7b0: 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
c7c0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
c7d0: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
c7e0: 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 1;.}.../*.**
c7f0: 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67   Convert a DbPag
c800: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
c810: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61  the pager into a
c820: 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79   MemPage used by
c830: 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
c840: 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  yer..*/.static M
c850: 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
c860: 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61  eFromDbPage(DbPa
c870: 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e  ge *pDbPage, Pgn
c880: 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64  o pgno, BtShared
c890: 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
c8a0: 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  e *pPage = (MemP
c8b0: 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
c8c0: 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
c8d0: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  e);.  pPage->aDa
c8e0: 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
c8f0: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
c900: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50  );.  pPage->pDbP
c910: 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  age = pDbPage;. 
c920: 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
c930: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  t;.  pPage->pgno
c940: 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65   = pgno;.  pPage
c950: 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50  ->hdrOffset = pP
c960: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
c970: 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e  00 : 0;.  return
c980: 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a   pPage; .}../*.*
c990: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
c9a0: 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e  m the pager.  In
c9b0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
c9c0: 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
c9d0: 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
c9e0: 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
c9f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
ca00: 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73  oContent flag is
ca10: 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74   set, it means t
ca20: 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
ca30: 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20  re about.** the 
ca40: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
ca50: 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
ca60: 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20  .  So do not go 
ca70: 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74  to the disk.** t
ca80: 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74  o fetch the cont
ca90: 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ent.  Just fill 
caa0: 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  in the content w
cab0: 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f  ith zeros for no
cac0: 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20  w..** If in the 
cad0: 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73  future we call s
cae0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
caf0: 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  () on this page,
cb00: 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77   that.** means w
cb10: 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74  e have started t
cb20: 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61  o be concerned a
cb30: 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64  bout content and
cb40: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61   the disk.** rea
cb50: 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
cb60: 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
cb70: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
cb80: 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68  eGetPage(.  BtSh
cb90: 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
cba0: 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
cbb0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
cbc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
cbd0: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
cbe0: 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
cbf0: 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
cc00: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
cc10: 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
cc20: 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  meter */.  int n
cc30: 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20  oContent        
cc40: 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70  /* Do not load p
cc50: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74  age content if t
cc60: 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rue */.){.  int 
cc70: 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
cc80: 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
cc90: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
cca0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
ccb0: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
ccc0: 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
ccd0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
cce0: 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
ccf0: 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
cd00: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
cd10: 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67  urn rc;.  *ppPag
cd20: 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f  e = btreePageFro
cd30: 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
cd40: 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72   pgno, pBt);.  r
cd50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cd60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65  .}../*.** Retrie
cd70: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
cd80: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
cd90: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
cda0: 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   page is not.** 
cdb0: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
cdc0: 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72  ager cache retur
cdd0: 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69  n NULL. Initiali
cde0: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
cdf0: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
ce00: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
ce10: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   if needed..*/.s
ce20: 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
ce30: 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42  treePageLookup(B
ce40: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
ce50: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61  no pgno){.  DbPa
ce60: 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
ce70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
ce80: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
ce90: 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61  utex) );.  pDbPa
cea0: 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ge = sqlite3Page
ceb0: 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61  rLookup(pBt->pPa
cec0: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
ced0: 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20  ( pDbPage ){.   
cee0: 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
cef0: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
cf00: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
cf10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
cf20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
cf30: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
cf40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
cf50: 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72  n pages. If ther
cf60: 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
cf70: 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72  .** error, retur
cf80: 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  n ((unsigned int
cf90: 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )-1)..*/.static 
cfa0: 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f  Pgno btreePageco
cfb0: 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  unt(BtShared *pB
cfc0: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  t){.  return pBt
cfd0: 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73  ->nPage;.}.u32 s
cfe0: 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50  qlite3BtreeLastP
cff0: 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  age(Btree *p){. 
d000: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d010: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
d020: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
d030: 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29  ((p->pBt->nPage)
d040: 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29  &0x8000000)==0 )
d050: 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  ;.  return (int)
d060: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
d070: 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
d080: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
d090: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
d0a0: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
d0b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
d0c0: 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69  ust a.** conveni
d0d0: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
d0e0: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
d0f0: 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ls to btreeGetPa
d100: 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72  ge() and .** btr
d110: 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
d120: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
d130: 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
d140: 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69   value *ppPage i
d150: 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65  s set to is unde
d160: 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
d170: 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
d180: 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
d190: 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
d1a0: 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
d1b0: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
d1c0: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
d1d0: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
d1e0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
d1f0: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
d200: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
d210: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
d220: 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
d230: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
d240: 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge     /* Write 
d250: 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
d260: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
d270: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
d280: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d290: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
d2a0: 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74  ;..  if( pgno>bt
d2b0: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
d2c0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
d2d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d2e0: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
d2f0: 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
d300: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
d310: 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
d320: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
d330: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  {.      rc = btr
d340: 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61  eeInitPage(*ppPa
d350: 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
d360: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d370: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
d380: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
d390: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d3a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
d3b0: 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
d3c0: 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d  ( pgno!=0 || rc=
d3d0: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
d3e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
d3f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
d400: 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
d410: 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
d420: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
d430: 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
d440: 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a  o btreeGetPage..
d450: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
d460: 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
d470: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
d480: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61  ( pPage ){.    a
d490: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
d4a0: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
d4b0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
d4c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
d4d0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d4e0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
d4f0: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
d500: 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
d510: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
d520: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
d530: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61  age)==pPage->aDa
d540: 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
d550: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d560: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
d570: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73  >mutex) );.    s
d580: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
d590: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d5a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
d5b0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
d5c0: 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  , when the pager
d5d0: 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61   reloads informa
d5e0: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61  tion into the ca
d5f0: 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  che.** so that t
d600: 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74  he cache is rest
d610: 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
d620: 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68  inal state at th
d630: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
d640: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  e transaction, f
d650: 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73  or each page res
d660: 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69  tored this routi
d670: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
d680: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d690: 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20   needs to reset 
d6a0: 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73  the extra data s
d6b0: 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e  ection at the en
d6c0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d of the.** page
d6d0: 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
d6e0: 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61  he restored data
d6f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d700: 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61   pageReinit(DbPa
d710: 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65  ge *pData){.  Me
d720: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
d730: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
d740: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
d750: 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
d760: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d770: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
d780: 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20  nt(pData)>0 );. 
d790: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
d7a0: 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
d7b0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d7c0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
d7d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
d7e0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
d7f0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
d800: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
d810: 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20  nt(pData)>1 ){. 
d820: 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69       /* pPage mi
d830: 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72  ght not be a btr
d840: 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67  ee page;  it mig
d850: 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ht be an overflo
d860: 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
d870: 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f  or ptrmap page o
d880: 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20  r a free page.  
d890: 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20  In those cases, 
d8a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
d8b0: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62      ** call to b
d8c0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77  treeInitPage() w
d8d0: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72  ill likely retur
d8e0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d8f0: 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  ..      ** But n
d900: 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62  o harm is done b
d910: 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20  y this.  And it 
d920: 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e  is very importan
d930: 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  t that.      ** 
d940: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
d950: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
d960: 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
d970: 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
d980: 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
d990: 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
d9a0: 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
d9b0: 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
d9c0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
d9d0: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
d9e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
d9f0: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
da00: 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a  r for a btree..*
da10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
da20: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
da30: 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ler(void *pArg){
da40: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
da50: 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
da60: 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
da70: 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
da80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
da90: 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
daa0: 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
dab0: 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
dac0: 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
dad0: 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
dae0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
daf0: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
db00: 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
db10: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
db20: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
db30: 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
db40: 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  me is NULL.** th
db50: 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
db60: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
db70: 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65  ted.  The epheme
db80: 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67  ral database mig
db90: 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69  ht.** be exclusi
dba0: 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  vely in memory, 
dbb0: 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20  or it might use 
dbc0: 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d  a disk-based mem
dbd0: 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69  ory cache..** Ei
dbe0: 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70  ther way, the ep
dbf0: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
dc00: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
dc10: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a  ically deleted .
dc20: 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ** when sqlite3B
dc30: 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
dc40: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
dc50: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
dc60: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
dc70: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
dc80: 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
dc90: 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
dca0: 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
dcb0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
dcc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66  ed..**.** The "f
dcd0: 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20  lags" parameter 
dce0: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
dcf0: 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  t might contain 
dd00: 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52  bits like.** BTR
dd10: 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  EE_OMIT_JOURNAL 
dd20: 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d  and/or BTREE_MEM
dd30: 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ORY..**.** If th
dd40: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
dd50: 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
dd60: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
dd70: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
dd80: 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
dd90: 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
dda0: 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
ddb0: 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
ddc0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
ddd0: 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
dde0: 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
ddf0: 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
de00: 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
de10: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
de20: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
de30: 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
de40: 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
de50: 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
de60: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
de70: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73  e3BtreeOpen(.  s
de80: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
de90: 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f  ,      /* VFS to
dea0: 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d   use for this b-
deb0: 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tree */.  const 
dec0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
ded0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
dee0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
def0: 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
df00: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
df10: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
df20: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
df30: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
df40: 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
df50: 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
df60: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
df70: 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
df80: 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
df90: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
dfa0: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
dfb0: 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
dfc0: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
dfd0: 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
dfe0: 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
dff0: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
e000: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
e010: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
e020: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
e030: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
e040: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
e050: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
e060: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
e070: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
e080: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
e090: 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
e0a0: 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
e0b0: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
e0c0: 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
e0d0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e0e0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
e0f0: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
e100: 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
e110: 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
e120: 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
e130: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
e140: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
e150: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
e160: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
e170: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
e180: 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
e190: 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
e1a0: 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69  /* True if openi
e1b0: 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c  ng an ephemeral,
e1c0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
e1d0: 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ase */.  const i
e1e0: 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46  nt isTempDb = zF
e1f0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
e200: 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a  ilename[0]==0;..
e210: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
e220: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
e230: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
e240: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
e250: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
e260: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
e270: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
e280: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
e290: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f  IT_MEMORYDB.  co
e2a0: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
e2b0: 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  = 0;.#else.  con
e2c0: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
e2d0: 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73   (zFilename && s
e2e0: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
e2f0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29   ":memory:")==0)
e300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e310: 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65          || (isTe
e320: 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54  mpDb && sqlite3T
e330: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29  empInMemory(db))
e340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e350: 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46          || (vfsF
e360: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
e370: 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23  EN_MEMORY)!=0;.#
e380: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
e390: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
e3a0: 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20  rt( pVfs!=0 );. 
e3b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e3c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
e3d0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
e3e0: 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29  rt( (flags&0xff)
e3f0: 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20  ==flags );   /* 
e400: 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62  flags fit in 8 b
e410: 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c  its */..  /* Onl
e420: 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  y a BTREE_SINGLE
e430: 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
e440: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
e450: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
e460: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f  lags & BTREE_UNO
e470: 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66  RDERED)==0 || (f
e480: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
e490: 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  GLE)!=0 );..  /*
e4a0: 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   A BTREE_SINGLE 
e4b0: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61  database is alwa
e4c0: 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61  ys a temporary a
e4d0: 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20  nd/or ephemeral 
e4e0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
e4f0: 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
e500: 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  LE)==0 || isTemp
e510: 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d  Db );..  if( isM
e520: 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
e530: 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
e540: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
e550: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
e560: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
e570: 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
e580: 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
e590: 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
e5a0: 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
e5b0: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
e5c0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
e5d0: 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
e5e0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
e5f0: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
e600: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
e610: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e620: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
e630: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
e640: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
e650: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
e660: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
e670: 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
e680: 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
e690: 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
e6a0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
e6b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
e6c0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
e6d0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
e6e0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
e6f0: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
e700: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
e710: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
e720: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
e730: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
e740: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
e750: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
e760: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
e770: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d  .  if( isTempDb=
e780: 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d  =0 && (isMemdb==
e790: 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53  0 || (vfsFlags&S
e7a0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21  QLITE_OPEN_URI)!
e7b0: 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76  =0) ){.    if( v
e7c0: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
e7d0: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
e7e0: 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
e7f0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
e800: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
e810: 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
e820: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
e830: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75  qlite3Malloc(nFu
e840: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
e850: 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
e860: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
e870: 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
e880: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
e890: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
e8a0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
e8b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e8c0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
e8d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e8e0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
e8f0: 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
e900: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
e910: 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
e920: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c  , zFilename, sql
e930: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
e940: 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  lename)+1);.    
e950: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e960: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
e970: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
e980: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9b0: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
e9c0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
e9d0: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
e9e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e9f0: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
ea00: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
ea10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ea20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
ea30: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
ea40: 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  }.      }.#if SQ
ea50: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
ea60: 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
ea70: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
ea80: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
ea90: 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
eaa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
eab0: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
eac0: 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
ead0: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
eae0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
eaf0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
eb00: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
eb10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
eb20: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
eb30: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
eb40: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
eb50: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
eb60: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
eb70: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
eb80: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
eb90: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
eba0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ebb0: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
ebc0: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
ebd0: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
ebe0: 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20  t->pPager, 0)). 
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec00: 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
ec10: 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
ec20: 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
ec30: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
ec40: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
ec50: 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
ec60: 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
ec70: 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
ec80: 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
ec90: 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
eca0: 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
ecb0: 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
ecc0: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ece0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ecf0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ed10: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ed20: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
ed30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ed40: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
ed50: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
ed60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ed70: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
ed80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ed90: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
eda0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
edb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
edc0: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
edd0: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
ede0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
edf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ee00: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
ee10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ee20: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
ee30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
ee40: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
ee50: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
ee60: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
ee70: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
ee80: 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
ee90: 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
eea0: 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
eeb0: 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
eec0: 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
eed0: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
eee0: 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
eef0: 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
ef00: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
ef10: 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
ef20: 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
ef30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ef40: 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
ef50: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
ef60: 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
ef70: 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
ef80: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
ef90: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
efa0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
efb0: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
efc0: 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
efd0: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
efe0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
eff0: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
f000: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
f010: 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
f020: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
f030: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
f040: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
f050: 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
f060: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
f070: 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
f080: 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
f090: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
f0a0: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
f0b0: 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
f0c0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f0d0: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
f0e0: 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
f0f0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f100: 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
f110: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
f120: 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
f130: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
f140: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
f150: 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
f160: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
f170: 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
f180: 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
f190: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
f1a0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
f1b0: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
f1c0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
f1d0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f1e0: 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
f1f0: 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
f200: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
f220: 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  TRA_SIZE, flags,
f230: 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
f240: 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
f250: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f260: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f270: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
f280: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
f290: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
f2a0: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
f2b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
f2c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f2d0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
f2e0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
f2f0: 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
f300: 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
f310: 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
f320: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
f330: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
f340: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
f350: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
f360: 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
f370: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
f380: 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
f390: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
f3a0: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
f3b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
f3c0: 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
f3d0: 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e  >pPager) ) pBt->
f3e0: 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
f3f0: 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65  READ_ONLY;.#ifde
f400: 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
f410: 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e  DELETE.    pBt->
f420: 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
f430: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23  SECURE_DELETE;.#
f440: 65 6e 64 69 66 0a 20 20 20 20 70 42 74 2d 3e 70  endif.    pBt->p
f450: 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65  ageSize = (zDbHe
f460: 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  ader[16]<<8) | (
f470: 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31  zDbHeader[17]<<1
f480: 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  6);.    if( pBt-
f490: 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
f4a0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
f4b0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
f4c0: 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
f4d0: 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
f4e0: 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
f4f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
f500: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
f510: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f520: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
f530: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
f540: 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
f550: 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
f560: 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
f570: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
f580: 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
f590: 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
f5a0: 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
f5b0: 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
f5c0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
f5d0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
f5e0: 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
f5f0: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
f600: 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
f610: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
f620: 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
f630: 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
f640: 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
f650: 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
f660: 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
f670: 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
f680: 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
f690: 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
f6a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
f6b0: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
f6c0: 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
f6d0: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
f6e0: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
f6f0: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
f700: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
f710: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
f720: 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
f730: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
f740: 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
f750: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
f760: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
f770: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f780: 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
f790: 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
f7a0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
f7b0: 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
f7c0: 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
f7d0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f7e0: 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
f7f0: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
f800: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
f810: 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
f820: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
f830: 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
f840: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
f850: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
f860: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
f870: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
f880: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
f890: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
f8a0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
f8b0: 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72  erve);.    if( r
f8c0: 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f  c ) goto btree_o
f8d0: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74  pen_out;.    pBt
f8e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
f8f0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
f900: 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
f910: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
f920: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
f930: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
f940: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
f950: 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  */.   .#if !defi
f960: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f970: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
f980: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f990: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
f9a0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
f9b0: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
f9c0: 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
f9d0: 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
f9e0: 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
f9f0: 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
fa00: 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45  le ){.      MUTE
fa10: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
fa20: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
fa30: 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 42 74  red; ).      pBt
fa40: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
fa50: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d    MUTEX_LOGIC( m
fa60: 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
fa70: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
fa80: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
fa90: 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20  IC_MASTER);).   
faa0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
fab0: 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
fac0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
fad0: 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
fae0: 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
faf0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
fb00: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
fb10: 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
fb20: 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
fb30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
fb40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
fb50: 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  M;.          db-
fb60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
fb70: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  0;.          got
fb80: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
fb90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fba0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
fbb0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
fbc0: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
fbd0: 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
fbe0: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
fbf0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
fc00: 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
fc10: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
fc20: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
fc30: 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
fc40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
fc50: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
fc60: 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
fc70: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
fc80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
fc90: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
fca0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
fcb0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
fcc0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
fcd0: 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
fce0: 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
fcf0: 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
fd00: 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
fd10: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
fd20: 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
fd30: 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
fd40: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
fd50: 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
fd60: 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
fd70: 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
fd80: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
fd90: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
fda0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
fdb0: 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
fdc0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
fdd0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
fde0: 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
fdf0: 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
fe00: 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
fe10: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
fe20: 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
fe30: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
fe40: 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
fe50: 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
fe60: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
fe70: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
fe80: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
fe90: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
fea0: 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
feb0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
fec0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
fed0: 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
fee0: 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
fef0: 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
ff00: 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
ff10: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
ff20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ff30: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
ff40: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
ff50: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
ff60: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
ff70: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
ff80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
ff90: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
ffa0: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
ffb0: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
ffc0: 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
ffd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
ffe0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
fff0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
10000 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
10010 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
10020 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10030 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
10040 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
10050 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
10060 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
10070 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
10080 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10090 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
100a0 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
100b0 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  pBtree = 0;.  }e
100c0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
100d0 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
100e0 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
100f0 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
10100 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
10110 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
10120 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c  t value. Except,
10130 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e   when opening on
10140 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61   an existing sha
10150 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c  red pager-cache,
10160 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63  .    ** do not c
10170 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d  hange the pager-
10180 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20  cache size..    
10190 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
101a0 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c  e3BtreeSchema(p,
101b0 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0, 0)==0 ){.   
101c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
101d0 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70  etCachesize(p->p
101e0 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
101f0 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
10200 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _SIZE);.    }.  
10210 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65  }.  if( mutexOpe
10220 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
10230 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10240 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29  eld(mutexOpen) )
10250 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
10260 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
10270 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pen);.  }.  retu
10280 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10290 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74  Decrement the Bt
102a0 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
102b0 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65  ter.  When it re
102c0 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72  aches zero,.** r
102d0 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72  emove the BtShar
102e0 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ed structure fro
102f0 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  m the sharing li
10300 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  st.  Return.** t
10310 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61  rue if the BtSha
10320 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
10330 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e   reaches zero an
10340 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73  d return.** fals
10350 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c  e if it is still
10360 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74   positive..*/.st
10370 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46  atic int removeF
10380 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42  romSharingList(B
10390 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23  tShared *pBt){.#
103a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
103b0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
103c0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
103d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
103e0 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61  aster; ).  BtSha
103f0 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
10400 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
10410 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10420 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
10430 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10440 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
10450 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
10460 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
10470 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
10480 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74  STER); ).  sqlit
10490 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
104a0 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
104b0 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
104c0 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
104d0 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53    if( GLOBAL(BtS
104e0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
104f0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d  aredCacheList)==
10500 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f  pBt ){.      GLO
10510 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
10520 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
10530 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65  List) = pBt->pNe
10540 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
10550 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f       pList = GLO
10560 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
10570 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
10580 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
10590 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  le( ALWAYS(pList
105a0 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  ) && pList->pNex
105b0 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t!=pBt ){.      
105c0 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70    pList=pList->p
105d0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
105e0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
105f0 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
10600 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pList->pNext = 
10610 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
10620 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
10630 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
10640 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  AFE ){.      sql
10650 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
10660 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
10670 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d   }.    removed =
10680 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
10690 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
106a0 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
106b0 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a   removed;.#else.
106c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
106d0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
106e0 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
106f0 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
10700 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
10710 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
10720 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a  (pBt) bytes..*/.
10730 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f  static void allo
10740 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74  cateTempSpace(Bt
10750 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
10760 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70  if( !pBt->pTmpSp
10770 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
10780 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
10790 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70  te3PageMalloc( p
107a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
107b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
107c0 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
107d0 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
107e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
107f0 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
10800 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
10810 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20  qlite3PageFree( 
10820 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
10830 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  .  pBt->pTmpSpac
10840 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
10850 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
10860 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
10870 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
10880 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
10890 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
108a0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
108b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
108c0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
108d0 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
108e0 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
108f0 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
10900 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
10910 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10920 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
10930 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
10940 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
10950 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
10960 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
10970 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
10980 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
10990 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
109a0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
109b0 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
109c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
109d0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
109e0 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
109f0 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
10a00 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
10a10 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
10a20 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
10a30 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
10a40 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
10a50 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
10a60 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
10a70 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
10a80 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
10a90 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
10aa0 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
10ab0 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69  LITE_OK);.  sqli
10ac0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
10ad0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
10ae0 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
10af0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
10b00 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
10b10 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
10b20 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
10b30 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
10b40 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
10b50 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
10b60 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
10b70 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
10b80 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
10b90 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
10ba0 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
10bb0 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
10bc0 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
10bd0 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
10be0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
10bf0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
10c00 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
10c10 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
10c20 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
10c30 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
10c40 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
10c50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
10c60 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
10c70 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
10c80 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
10c90 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
10ca0 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
10cb0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
10cc0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
10cd0 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
10ce0 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
10cf0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
10d00 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
10d10 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
10d20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10d30 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
10d40 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
10d50 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
10d60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
10d70 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
10d80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10d90 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
10da0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
10db0 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
10dc0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
10dd0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
10de0 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
10df0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
10e00 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
10e10 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
10e20 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
10e30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
10e40 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
10e50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10e60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
10e70 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
10e80 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
10e90 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
10ea0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
10eb0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
10ec0 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
10ed0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
10ee0 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
10ef0 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
10f00 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
10f10 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
10f20 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
10f30 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
10f40 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
10f50 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
10f60 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
10f70 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
10f80 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
10f90 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
10fa0 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
10fb0 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
10fc0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
10fd0 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
10fe0 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
10ff0 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
11000 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
11010 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
11020 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11030 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
11040 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
11050 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
11060 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
11070 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
11080 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
11090 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
110a0 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
110b0 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
110c0 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
110d0 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
110e0 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
110f0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
11100 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
11110 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
11120 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
11130 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
11140 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
11150 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11160 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
11170 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11180 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
11190 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
111a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
111b0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
111c0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
111d0 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
111e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
111f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
11200 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11210 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
11220 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
11230 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
11240 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
11250 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
11260 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
11270 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
11280 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
11290 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
112a0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
112b0 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
112c0 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
112d0 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
112e0 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
112f0 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
11300 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
11310 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
11320 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
11330 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
11340 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
11350 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
11360 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
11370 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
11380 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
11390 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
113a0 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
113b0 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
113c0 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
113d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
113e0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
113f0 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
11400 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  eeSetSafetyLevel
11410 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
11420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11430 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74  e btree to set t
11440 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  he safety level 
11450 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 76 65  on */.  int leve
11460 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
11470 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  * PRAGMA synchro
11480 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d  nous.  1=OFF, 2=
11490 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a  NORMAL, 3=FULL *
114a0 2f 0a 20 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  /.  int fullSync
114b0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52  ,          /* PR
114c0 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 2e 20  AGMA fullfsync. 
114d0 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 46 75 6c  */.  int ckptFul
114e0 6c 53 79 6e 63 20 20 20 20 20 20 20 2f 2a 20 50  lSync       /* P
114f0 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74  RAGMA checkpoint
11500 5f 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a 29 7b 0a  _fullfync */.){.
11510 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
11520 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
11530 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11540 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
11550 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
11560 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65  ( level>=1 && le
11570 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 73 71 6c 69  vel<=3 );.  sqli
11580 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11590 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
115a0 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
115b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65  Bt->pPager, leve
115c0 6c 2c 20 66 75 6c 6c 53 79 6e 63 2c 20 63 6b 70  l, fullSync, ckp
115d0 74 46 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71  tFullSync);.  sq
115e0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
115f0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
11600 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
11610 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
11620 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
11630 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
11640 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
11650 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
11660 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
11670 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
11680 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
11690 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
116a0 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
116b0 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
116c0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
116d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
116e0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
116f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11700 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
11710 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
11720 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11730 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
11740 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
11750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11760 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
11770 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
11780 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11790 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
117a0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
117b0 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
117c0 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
117d0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
117e0 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
117f0 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
11800 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
11810 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
11820 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
11830 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
11840 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
11850 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
11860 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
11870 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
11880 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
11890 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
118a0 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
118b0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
118c0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
118d0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
118e0 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
118f0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
11900 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
11910 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
11920 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
11930 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
11940 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
11950 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
11960 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
11970 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
11980 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
11990 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
119a0 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
119b0 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
119c0 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
119d0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
119e0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
119f0 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
11a00 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
11a10 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
11a20 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
11a30 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
11a40 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
11a50 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
11a60 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
11a70 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
11a80 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
11a90 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
11aa0 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
11ab0 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
11ac0 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
11ad0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
11ae0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
11af0 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
11b00 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
11b10 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
11b20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
11b30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11b40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11b50 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
11b60 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
11b70 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
11b80 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
11b90 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
11ba0 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
11bb0 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
11bc0 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
11bd0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11be0 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
11bf0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
11c00 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
11c10 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
11c20 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
11c30 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
11c40 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
11c50 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
11c60 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
11c70 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
11c80 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
11c90 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
11ca0 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
11cb0 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
11cc0 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
11cd0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
11ce0 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
11cf0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
11d00 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
11d10 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
11d20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
11d30 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
11d40 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
11d50 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
11d60 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
11d70 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
11d80 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
11d90 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
11da0 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
11db0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
11dc0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
11dd0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
11de0 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
11df0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
11e00 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
11e10 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11e20 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
11e30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
11e40 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
11e50 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
11e60 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
11e70 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
11e80 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
11e90 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
11ea0 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 64  geSize;.}..#if d
11eb0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
11ec0 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69  S_CODEC) || defi
11ed0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
11ee0 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  )./*.** This fun
11ef0 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
11f00 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
11f10 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78  GetReserve(), ex
11f20 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
11f30 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
11f40 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72  ed if it is guar
11f50 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
11f60 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
11f70 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e  already.** held.
11f80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  .**.** This is u
11f90 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65  seful in one spe
11fa0 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65  cial case in the
11fb0 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65   backup API code
11fc0 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20   where it is.** 
11fd0 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73  known that the s
11fe0 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  hared b-tree mut
11ff0 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20  ex is held, but 
12000 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  the mutex on the
12010 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61   .** database ha
12020 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
12030 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69  p is not. In thi
12040 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65  s case if sqlite
12050 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a  3BtreeEnter().**
12060 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c   were to be call
12070 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c  ed, it might col
12080 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f  lide with some o
12090 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f  ther operation o
120a0 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
120b0 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
120c0 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75  ns *p, causing u
120d0 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f  ndefined behavio
120e0 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ur..*/.int sqlit
120f0 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
12100 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a  eNoMutex(Btree *
12110 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
12120 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12130 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  (p->pBt->mutex) 
12140 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  );.  return p->p
12150 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
12160 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
12170 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  e;.}.#endif /* S
12180 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20  QLITE_HAS_CODEC 
12190 7c 7c 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  || SQLITE_DEBUG 
121a0 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
121b0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
121c0 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
121d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
121e0 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a  MIT_VACUUM)./*.*
121f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
12200 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
12210 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
12220 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
12230 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
12240 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
12250 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
12260 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
12270 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
12280 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
12290 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  xtensions..*/.in
122a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
122b0 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  tReserve(Btree *
122c0 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
122d0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
122e0 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  (p);.  n = p->pB
122f0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
12300 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
12310 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12320 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
12330 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
12340 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
12350 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
12360 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
12370 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
12380 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
12390 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
123a0 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
123b0 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
123c0 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
123d0 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
123e0 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
123f0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
12400 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
12410 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
12420 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
12430 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
12440 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12450 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
12460 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
12470 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
12480 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
12490 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
124a0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
124b0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53  *.** Set the BTS
124c0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66  _SECURE_DELETE f
124d0 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69  lag if newFlag i
124e0 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65  s 0 or 1.  If ne
124f0 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20  wFlag is -1,.** 
12500 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61  then make no cha
12510 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65  nges.  Always re
12520 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
12530 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  f the BTS_SECURE
12540 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69  _DELETE.** setti
12550 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ng after the cha
12560 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nge..*/.int sqli
12570 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
12580 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69  lete(Btree *p, i
12590 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69  nt newFlag){.  i
125a0 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt b;.  if( p==0
125b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
125c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
125d0 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c  (p);.  if( newFl
125e0 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ag>=0 ){.    p->
125f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
12600 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c   ~BTS_SECURE_DEL
12610 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77  ETE;.    if( new
12620 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62  Flag ) p->pBt->b
12630 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53  tsFlags |= BTS_S
12640 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
12650 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74  } .  b = (p->pBt
12660 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
12670 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21  _SECURE_DELETE)!
12680 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  =0;.  sqlite3Btr
12690 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
126a0 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66  turn b;.}.#endif
126b0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
126c0 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
126d0 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
126e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
126f0 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a  VACUUM) */../*.*
12700 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75  * Change the 'au
12710 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
12720 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  rty of the datab
12730 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74  ase. If the 'aut
12740 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61  oVacuum'.** para
12750 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
12760 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  o, then auto-vac
12770 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62  uum mode is enab
12780 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74  led. If zero, it
12790 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e  .** is disabled.
127a0 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
127b0 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d  ue for the auto-
127c0 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20  vacuum property 
127d0 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  is .** determine
127e0 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
127f0 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
12800 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74  UM macro..*/.int
12810 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
12820 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
12830 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63   *p, int autoVac
12840 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  uum){.#ifdef SQL
12850 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
12860 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  UUM.  return SQL
12870 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65  ITE_READONLY;.#e
12880 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a  lse.  BtShared *
12890 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
128a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
128b0 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75  OK;.  u8 av = (u
128c0 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20  8)autoVacuum;.. 
128d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
128e0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42  er(p);.  if( (pB
128f0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
12900 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
12910 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30  )!=0 && (av ?1:0
12920 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  )!=pBt->autoVacu
12930 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
12940 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
12950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
12960 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61  ->autoVacuum = a
12970 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d  v ?1:0;.    pBt-
12980 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76  >incrVacuum = av
12990 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  ==2 ?1:0;.  }.  
129a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
129b0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
129c0 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
129d0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
129e0 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f  lue of the 'auto
129f0 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
12a00 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75  y. If auto-vacuu
12a10 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64  m is .** enabled
12a20 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   1 is returned. 
12a30 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a  Otherwise 0..*/.
12a40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12a50 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  GetAutoVacuum(Bt
12a60 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20  ree *p){.#ifdef 
12a70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12a80 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
12a90 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
12aa0 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69  _NONE;.#else.  i
12ab0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
12ac0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
12ad0 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d   rc = (.    (!p-
12ae0 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
12af0 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
12b00 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70  UM_NONE:.    (!p
12b10 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ->pBt->incrVacuu
12b20 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
12b30 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54  UUM_FULL:.    BT
12b40 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49  REE_AUTOVACUUM_I
12b50 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74  NCR.  );.  sqlit
12b60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12b70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
12b80 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ndif.}.../*.** G
12b90 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  et a reference t
12ba0 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20  o pPage1 of the 
12bb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
12bc0 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  This will.** als
12bd0 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
12be0 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c  lock on that fil
12bf0 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
12c00 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
12c10 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
12c20 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  he file is not a
12c30 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  .** well-formed 
12c40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
12c50 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  hen SQLITE_CORRU
12c60 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  PT is returned..
12c70 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
12c80 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
12c90 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  e database is lo
12ca0 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f  cked.  SQLITE_NO
12cb0 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  MEM.** is return
12cc0 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74  ed if we run out
12cd0 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a   of memory. .*/.
12ce0 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42  static int lockB
12cf0 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70  tree(BtShared *p
12d00 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Bt){.  int rc;  
12d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12d20 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
12d30 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  subfunctions */.
12d40 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
12d50 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31  1;     /* Page 1
12d60 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12d70 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
12d80 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
12d90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
12da0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
12db0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  se */.  int nPag
12dc0 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20  eFile = 0;   /* 
12dd0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
12de0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
12df0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
12e00 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f  ageHeader;     /
12e10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
12e20 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
12e30 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68  e according to h
12e40 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  dr */..  assert(
12e50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12e60 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12e70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
12e80 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20  ->pPage1==0 );. 
12e90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
12ea0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74  erSharedLock(pBt
12eb0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  ->pPager);.  if(
12ec0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12ed0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
12ee0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
12ef0 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
12f00 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
12f10 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
12f20 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73  n rc;..  /* Do s
12f30 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  ome checking to 
12f40 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20  help insure the 
12f50 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72  file we opened r
12f60 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20  eally is.  ** a 
12f70 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66  valid database f
12f80 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61  ile. .  */.  nPa
12f90 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72  ge = nPageHeader
12fa0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
12fb0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
12fc0 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  a);.  sqlite3Pag
12fd0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
12fe0 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46  >pPager, &nPageF
12ff0 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67  ile);.  if( nPag
13000 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32  e==0 || memcmp(2
13010 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  4+(u8*)pPage1->a
13020 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50  Data, 92+(u8*)pP
13030 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d  age1->aData,4)!=
13040 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  0 ){.    nPage =
13050 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a   nPageFile;.  }.
13060 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
13070 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a  .    u32 pageSiz
13080 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c  e;.    u32 usabl
13090 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
130a0 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
130b0 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
130c0 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
130d0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
130e0 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
130f0 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
13100 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
13110 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
13120 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
13130 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20  MIT_WAL.    if( 
13140 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
13150 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
13160 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
13170 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
13180 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
13190 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
131a0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
131b0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
131c0 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20  if( page1[18]>2 
131d0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
131e0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
131f0 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
13200 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
13210 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >2 ){.      goto
13220 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
13230 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
13240 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76  * If the write v
13250 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f  ersion is set to
13260 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73   2, this databas
13270 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65  e should be acce
13280 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57  ssed.    ** in W
13290 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  AL mode. If the 
132a0 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  log is not alrea
132b0 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74  dy open, open it
132c0 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20   now. Then .    
132d0 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
132e0 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77  _OK and return w
132f0 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e  ithout populatin
13300 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65  g BtShared.pPage
13310 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  1..    ** The ca
13320 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69  ller detects thi
13330 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73  s and calls this
13340 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e   function again.
13350 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20   This is.    ** 
13360 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20  required as the 
13370 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
13380 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  1 currently in t
13390 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a  he page1 buffer.
133a0 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62      ** may not b
133b0 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72  e the latest ver
133c0 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79  sion - there may
133d0 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20   be a newer one 
133e0 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a  in the log.    *
133f0 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  * file..    */. 
13400 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
13410 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73  ==2 && (pBt->bts
13420 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57  Flags & BTS_NO_W
13430 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AL)==0 ){.      
13440 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  int isOpen = 0;.
13450 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13460 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
13470 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f  Bt->pPager, &isO
13480 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pen);.      if( 
13490 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
134a0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
134b0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
134c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
134d0 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20   isOpen==0 ){.  
134e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
134f0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
13500 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13510 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
13520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
13530 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e  OTADB;.    }.#en
13540 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  dif..    /* The 
13550 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64  maximum embedded
13560 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
13570 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20  e exactly 25%.  
13580 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a  And the minimum.
13590 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20      ** embedded 
135a0 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
135b0 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20   12.5% for both 
135c0 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f  leaf-data and no
135d0 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20  n-leaf-data..   
135e0 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   ** The original
135f0 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20   design allowed 
13600 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f  these amounts to
13610 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66   vary, but as of
13620 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  .    ** version 
13630 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72  3.6.0, we requir
13640 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78  e them to be fix
13650 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
13660 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31  f( memcmp(&page1
13670 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c  [21], "\100\040\
13680 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20  040",3)!=0 ){.  
13690 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
136a0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
136b0 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  }.    pageSize =
136c0 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20   (page1[16]<<8) 
136d0 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36  | (page1[17]<<16
136e0 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  );.    if( ((pag
136f0 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
13700 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
13710 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
13720 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
13730 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
13740 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
13750 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
13760 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
13770 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
13780 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
13790 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
137a0 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
137b0 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28  1[20];.    if( (
137c0 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42  u32)pageSize!=pB
137d0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
137e0 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
137f0 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
13800 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
13810 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
13820 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
13830 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
13840 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
13850 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
13860 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
13870 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
13880 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
13890 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
138a0 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
138b0 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
138c0 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
138d0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
138e0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
138f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
13900 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
13910 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
13920 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
13930 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
13940 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
13950 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
13960 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
13970 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
13980 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
13990 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
139a0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
139b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
139c0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
139d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
139e0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13a10 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
13a20 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
13a30 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
13a40 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c  if( (pBt->db->fl
13a50 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63  ags & SQLITE_Rec
13a60 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26  overyMode)==0 &&
13a70 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65   nPage>nPageFile
13a80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
13a90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
13aa0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
13ab0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13ac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13ad0 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
13ae0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
13af0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
13b00 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
13b10 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
13b20 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
13b30 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
13b40 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
13b50 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
13b60 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
13b70 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
13b80 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
13b90 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
13ba0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
13bb0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
13bc0 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
13bd0 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
13be0 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
13bf0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
13c00 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
13c10 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
13c20 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
13c30 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
13c40 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
13c50 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
13c60 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
13c70 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
13c80 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
13c90 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
13ca0 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
13cb0 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
13cc0 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
13cd0 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
13ce0 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
13cf0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
13d00 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
13d10 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
13d20 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
13d30 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
13d40 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
13d50 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
13d60 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
13d70 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
13d80 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
13d90 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
13da0 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
13db0 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
13dc0 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
13dd0 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
13de0 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
13df0 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
13e00 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
13e10 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
13e20 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
13e30 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
13e40 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
13e50 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
13e60 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
13e70 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
13e80 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
13e90 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
13ea0 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
13eb0 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
13ec0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
13ed0 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
13ee0 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
13ef0 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
13f00 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69  2/255 - 23);.  i
13f10 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  f( pBt->maxLocal
13f20 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d  >127 ){.    pBt-
13f30 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
13f40 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b   = 127;.  }else{
13f50 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
13f60 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29  tePayload = (u8)
13f70 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
13f80 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
13f90 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
13fa0 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
13fb0 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
13fc0 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
13fd0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
13fe0 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
13ff0 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
14000 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
14010 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
14020 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
14030 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
14040 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
14050 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
14060 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
14070 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
14080 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
14090 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
140a0 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
140b0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
140c0 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
140d0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
140e0 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
140f0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
14100 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
14110 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
14120 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
14130 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
14140 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
14150 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
14160 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
14170 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
14180 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
14190 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
141a0 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72  eIfUnused(BtShar
141b0 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65  ed *pBt){.  asse
141c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
141d0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
141e0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
141f0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20  pBt->pCursor==0 
14200 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
14210 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
14220 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
14230 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
14240 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
14250 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
14260 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
14270 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
14280 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
14290 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
142a0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31  (pBt->pPager)==1
142b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
142c0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
142d0 74 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ta );.    releas
142e0 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  ePage(pBt->pPage
142f0 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61  1);.    pBt->pPa
14300 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ge1 = 0;.  }.}..
14310 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69  /*.** If pBt poi
14320 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  nts to an empty 
14330 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72  file then conver
14340 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c  t that empty fil
14350 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20  e.** into a new 
14360 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62  empty database b
14370 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
14380 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
14390 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
143a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
143b0 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
143c0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
143d0 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
143e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
143f0 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  a;.  int rc;..  
14400 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14410 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
14420 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
14430 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a  pBt->nPage>0 ){.
14440 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14450 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20  E_OK;.  }.  pP1 
14460 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
14470 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
14480 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
14490 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
144a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
144b0 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
144c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
144d0 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
144e0 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
144f0 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
14500 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
14510 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
14520 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
14530 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38    data[16] = (u8
14540 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
14550 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >>8)&0xff);.  da
14560 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70  ta[17] = (u8)((p
14570 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36  Bt->pageSize>>16
14580 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
14590 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
145a0 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  19] = 1;.  asser
145b0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
145c0 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze<=pBt->pageSiz
145d0 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65  e && pBt->usable
145e0 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70  Size+255>=pBt->p
145f0 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
14600 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d  [20] = (u8)(pBt-
14610 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
14620 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
14630 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20  data[21] = 64;. 
14640 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a   data[22] = 32;.
14650 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b    data[23] = 32;
14660 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
14670 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
14680 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
14690 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
146a0 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
146b0 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46  A );.  pBt->btsF
146c0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
146d0 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
146e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
146f0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
14700 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
14710 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
14720 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
14730 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
14740 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
14750 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
14760 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
14770 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
14780 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
14790 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
147a0 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
147b0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
147c0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d  );.#endif.  pBt-
147d0 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61  >nPage = 1;.  da
147e0 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65  ta[31] = 1;.  re
147f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14800 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
14810 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61  ize the first pa
14820 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
14830 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e  se file (creatin
14840 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
14850 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
14860 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20  single page and 
14870 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  no schema object
14880 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s). Return SQLIT
14890 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65  E_OK.** if succe
148a0 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
148b0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
148c0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
148d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77   sqlite3BtreeNew
148e0 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  Db(Btree *p){.  
148f0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
14900 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
14910 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20    p->pBt->nPage 
14920 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44  = 0;.  rc = newD
14930 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b  atabase(p->pBt);
14940 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14950 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14960 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
14970 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
14980 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
14990 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
149a0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
149b0 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
149c0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
149d0 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
149e0 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
149f0 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
14a00 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
14a10 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
14a20 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
14a30 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
14a40 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
14a50 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
14a60 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
14a70 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
14a80 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
14a90 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
14aa0 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
14ab0 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
14ac0 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
14ad0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
14ae0 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
14af0 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
14b00 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
14b10 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
14b20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
14b30 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
14b40 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
14b50 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
14b60 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
14b70 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
14b80 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
14b90 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14ba0 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
14bb0 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
14bc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
14bd0 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
14be0 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
14bf0 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
14c00 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
14c10 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
14c20 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
14c30 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
14c40 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
14c50 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
14c60 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
14c70 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
14c80 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
14c90 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
14ca0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
14cb0 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
14cc0 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
14cd0 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
14ce0 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
14cf0 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
14d00 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
14d10 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
14d20 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
14d30 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
14d40 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
14d50 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
14d60 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
14d70 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
14d80 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
14d90 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
14da0 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
14db0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
14dc0 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
14dd0 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
14de0 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
14df0 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
14e00 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
14e10 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
14e20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
14e30 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
14e40 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
14e50 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
14e60 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
14e70 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
14e80 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
14e90 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
14ea0 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
14eb0 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
14ec0 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
14ed0 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
14ee0 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
14ef0 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
14f00 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
14f10 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
14f20 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
14f30 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
14f40 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
14f50 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
14f60 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
14f70 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
14f80 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
14f90 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
14fa0 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
14fb0 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
14fc0 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
14fd0 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
14fe0 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
14ff0 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
15000 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15010 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
15020 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
15030 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42  ){.  sqlite3 *pB
15040 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68  lock = 0;.  BtSh
15050 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15060 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
15070 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
15080 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15090 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
150a0 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
150b0 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
150c0 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
150d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
150e0 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
150f0 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
15100 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
15110 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
15120 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
15130 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
15140 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
15150 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
15160 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
15170 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
15180 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
15190 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
151a0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  _begun;.  }..  /
151b0 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
151c0 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
151d0 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
151e0 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
151f0 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
15200 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
15210 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66  _ONLY)!=0 && wrf
15220 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
15230 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
15240 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
15250 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
15260 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15270 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
15280 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
15290 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
152a0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
152b0 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
152c0 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
152d0 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
152e0 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
152f0 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
15300 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
15310 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
15320 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
15330 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66  .  */.  if( (wrf
15340 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
15350 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
15360 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70  _WRITE).   || (p
15370 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
15380 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20  TS_PENDING)!=0. 
15390 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d   ){.    pBlock =
153a0 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
153b0 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77  b;.  }else if( w
153c0 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42  rflag>1 ){.    B
153d0 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
153e0 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
153f0 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
15400 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
15410 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
15420 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
15430 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b  {.        pBlock
15440 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
15450 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72  ->db;.        br
15460 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
15470 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c   }.  }.  if( pBl
15480 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ock ){.    sqlit
15490 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
154a0 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63  ked(p->db, pBloc
154b0 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  k);.    rc = SQL
154c0 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
154d0 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f  DCACHE;.    goto
154e0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
154f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
15500 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
15510 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
15520 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
15530 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
15540 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
15550 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
15560 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
15570 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
15580 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
15590 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
155a0 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
155b0 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
155c0 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
155d0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
155e0 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
155f0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
15600 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
15610 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
15620 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73  gun;..  pBt->bts
15630 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e  Flags &= ~BTS_IN
15640 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
15650 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
15660 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  =0 ) pBt->btsFla
15670 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41  gs |= BTS_INITIA
15680 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20  LLY_EMPTY;.  do 
15690 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
156a0 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
156b0 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
156c0 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
156d0 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
156e0 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
156f0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
15700 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
15710 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
15720 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
15730 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
15740 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
15750 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
15760 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
15770 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
15780 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
15790 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
157a0 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
157b0 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
157c0 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
157d0 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
157e0 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
157f0 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
15800 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
15810 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
15820 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
15830 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
15840 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
15850 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
15860 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
15870 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15880 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
15890 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42  ){.      if( (pB
158a0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
158b0 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
158c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
158d0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
158e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
158f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15900 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
15910 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
15920 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
15930 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
15940 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
15950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15960 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
15970 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
15980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15990 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
159a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
159b0 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
159c0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
159d0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
159e0 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
159f0 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
15a00 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
15a10 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
15a20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
15a30 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
15a40 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
15a50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15a60 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
15a70 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
15a80 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
15a90 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
15aa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
15ab0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
15ac0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
15ad0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
15ae0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
15af0 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
15b00 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
15b10 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
15b20 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
15b30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
15b40 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
15b50 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
15b60 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
15b70 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
15b80 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
15b90 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
15ba0 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
15bb0 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
15bc0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
15bd0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
15be0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
15bf0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
15c00 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
15c10 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
15c20 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
15c30 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
15c40 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
15c50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
15c60 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
15c70 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
15c80 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
15c90 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
15ca0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
15cb0 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43  lags &= ~BTS_EXC
15cc0 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66  LUSIVE;.      if
15cd0 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74  ( wrflag>1 ) pBt
15ce0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
15cf0 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e  S_EXCLUSIVE;.#en
15d00 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
15d10 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
15d20 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
15d30 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
15d40 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
15d50 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
15d60 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
15d70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15d80 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
15d90 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
15da0 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
15db0 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
15dc0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
15dd0 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
15de0 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
15df0 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
15e00 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
15e10 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
15e20 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
15e30 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
15e40 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
15e50 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15e60 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15e70 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
15e80 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
15e90 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
15ea0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
15eb0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
15ec0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
15ed0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
15ee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15ef0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
15f00 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
15f10 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
15f20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15f30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
15f40 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
15f50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15f60 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
15f70 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
15f80 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
15f90 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
15fa0 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
15fb0 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20   of.    ** open 
15fc0 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74  savepoints. If t
15fd0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
15fe0 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ter is greater t
15ff0 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a  han 0 and.    **
16000 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
16010 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
16020 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
16030 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
16040 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
16050 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
16060 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
16070 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d  ->pPager, p->db-
16080 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >nSavepoint);.  
16090 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
160a0 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
160b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
160c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
160d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
160e0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
160f0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
16100 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
16110 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
16120 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
16130 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
16140 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
16150 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
16160 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
16170 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
16180 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
16190 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
161a0 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
161b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
161c0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
161d0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
161e0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16200 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
16210 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
16220 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
16250 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
16260 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16280 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
16290 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
162a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
162b0 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73  ge->pBt;.  u8 is
162c0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
162d0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
162e0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
162f0 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
16300 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
16310 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
16320 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
16330 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
16340 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
16350 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16360 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
16370 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d  ptrmaps_out;.  }
16380 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
16390 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
163a0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
163b0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
163c0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
163d0 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
163e0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
163f0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
16400 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
16410 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
16420 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
16430 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
16440 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
16450 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
16460 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
16470 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
16480 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
16490 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
164a0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
164b0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
164c0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
164d0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
164e0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
164f0 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
16500 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
16510 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74  , &rc);.  }..set
16520 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
16530 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
16540 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
16550 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16560 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
16570 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
16580 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
16590 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
165a0 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
165b0 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
165c0 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
165d0 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
165e0 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
165f0 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
16600 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
16610 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
16620 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
16630 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
16640 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
16650 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
16660 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
16670 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
16680 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
16690 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
166a0 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
166b0 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
166c0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
166d0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
166e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
166f0 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
16700 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
16710 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
16720 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
16730 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
16740 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
16750 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
16760 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
16770 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16780 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
16790 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
167a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
167b0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
167c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
167d0 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
167e0 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
167f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16800 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
16810 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
16820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
16830 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
16840 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
16850 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
16860 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
16870 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
16880 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
16890 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
168a0 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
168b0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
168c0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
168d0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
168e0 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
168f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16900 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
16910 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
16920 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
16930 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
16940 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72  .    u8 isInitOr
16950 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
16960 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
16970 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
16980 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
16990 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65  (pPage);.    nCe
169a0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
169b0 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
169c0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
169d0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
169e0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
169f0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
16a00 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
16a10 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
16a20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
16a30 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50  ;.        btreeP
16a40 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
16a50 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
16a60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
16a70 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20  fo.iOverflow.   
16a80 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69        && pCell+i
16a90 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c  nfo.iOverflow+3<
16aa0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50  =pPage->aData+pP
16ab0 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20  age->maskPage.  
16ac0 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d         && iFrom=
16ad0 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
16ae0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
16af0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
16b00 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
16b10 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
16b20 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20  rflow], iTo);.  
16b30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16b40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16b50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
16b60 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
16b70 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
16b80 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
16b90 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
16ba0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16bc0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
16bd0 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
16be0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
16bf0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
16c00 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
16c10 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
16c20 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
16c30 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
16c40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16c50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
16c60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16c70 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
16c80 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
16c90 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
16ca0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
16cb0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
16cc0 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
16cd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16ce0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
16cf0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
16d00 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
16d10 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
16d20 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
16d30 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
16d40 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
16d50 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
16d60 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69  *.** The isCommi
16d70 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
16d80 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
16d90 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
16da0 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a  er that.** the j
16db0 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
16dc0 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
16dd0 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
16de0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a   pDbPage->pgno .
16df0 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
16e00 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
16e10 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
16e20 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
16e30 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61  te to that.** pa
16e40 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
16e50 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
16e60 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
16e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
16e80 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
16e90 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
16ea0 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
16eb0 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
16ec0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
16ed0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
16ee0 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
16ef0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
16f00 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
16f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
16f20 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
16f30 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
16f40 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
16f50 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
16f60 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
16f70 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
16f80 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
16f90 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
16fa0 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74       /* isCommit
16fb0 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20   flag passed to 
16fc0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
16fd0 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  page */.){.  Mem
16fe0 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
16ff0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
17000 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
17010 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
17020 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
17030 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
17040 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
17050 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
17060 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
17070 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
17080 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
17090 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
170a0 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
170b0 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
170c0 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
170d0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
170e0 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
170f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17100 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
17110 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
17120 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
17130 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
17140 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
17150 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
17160 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
17170 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
17180 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
17190 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
171a0 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
171b0 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
171c0 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
171d0 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
171e0 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
171f0 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
17200 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
17210 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
17220 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
17230 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
17240 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17250 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
17260 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
17270 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
17280 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
17290 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
172a0 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
172b0 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
172c0 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
172d0 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
172e0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
172f0 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
17300 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
17310 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
17320 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
17330 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
17340 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
17350 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
17360 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
17370 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
17380 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
17390 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
173a0 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
173b0 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
173c0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
173d0 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
173e0 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
173f0 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
17400 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
17410 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
17420 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
17430 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
17440 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
17450 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
17460 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
17470 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
17480 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17490 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
174a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
174b0 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
174c0 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
174d0 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
174e0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
174f0 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
17500 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
17510 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
17520 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
17530 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
17540 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17550 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
17560 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17570 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
17580 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
17590 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
175a0 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
175b0 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
175c0 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
175d0 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
175e0 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
175f0 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
17600 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
17610 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
17620 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
17630 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
17640 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
17650 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
17660 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
17670 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
17680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17690 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
176a0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
176b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
176c0 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
176d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
176e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
176f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
17700 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
17710 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
17720 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
17730 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
17740 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
17750 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
17760 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
17770 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
17780 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17790 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  K ){.      ptrma
177a0 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
177b0 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
177c0 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
177d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
177e0 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
177f0 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
17800 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
17810 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
17820 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
17830 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
17840 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
17850 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
17860 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
17870 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
17880 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
17890 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
178a0 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72  successful,.** r
178b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
178c0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
178d0 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
178e0 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20  therefore no.** 
178f0 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67  point in calling
17900 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
17910 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51  gain), return SQ
17920 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
17930 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79   More specificly
17940 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
17950 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
17960 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20  rganize the .** 
17970 64 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74  database so that
17980 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
17990 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
179a0 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69  ntly in use.** i
179b0 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75  s no longer in u
179c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
179d0 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20   nFin parameter 
179e0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69  is non-zero, thi
179f0 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
17a00 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  es.** that the c
17a10 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
17a20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
17a30 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a  umStep() until.*
17a40 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  * it returns SQL
17a50 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65  ITE_DONE or an e
17a60 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e  rror, and that n
17a70 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75  Fin is the.** nu
17a80 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
17a90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17aa0 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74  will contain aft
17ab0 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63  er this .** proc
17ac0 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e  ess is complete.
17ad0 20 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72    If nFin is zer
17ae0 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  o, it is assumed
17af0 20 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56 61 63   that.** incrVac
17b00 75 75 6d 53 74 65 70 28 29 20 77 69 6c 6c 20 62  uumStep() will b
17b10 65 20 63 61 6c 6c 65 64 20 61 20 66 69 6e 69 74  e called a finit
17b20 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
17b30 73 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79 20 6f  s.** which may o
17b40 72 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74 79 20  r may not empty 
17b50 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 41  the freelist.  A
17b60 20 66 75 6c 6c 20 61 75 74 6f 76 61 63 75 75 6d   full autovacuum
17b70 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30 2e 20  .** has nFin>0. 
17b80 20 41 20 22 50 52 41 47 4d 41 20 69 6e 63 72 65   A "PRAGMA incre
17b90 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22 20 68  mental_vacuum" h
17ba0 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f 0a 73  as nFin==0..*/.s
17bb0 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
17bc0 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
17bd0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
17be0 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29  n, Pgno iLastPg)
17bf0 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
17c00 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
17c10 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
17c20 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
17c30 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ee-list */.  int
17c40 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
17c50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17c60 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
17c70 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73  ;.  assert( iLas
17c80 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69  tPg>nFin );..  i
17c90 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
17ca0 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
17cb0 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
17cc0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
17cd0 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79  t) ){.    u8 eTy
17ce0 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
17cf0 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65  rPage;..    nFre
17d00 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65  eList = get4byte
17d10 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
17d20 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69  Data[36]);.    i
17d30 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
17d40 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17d50 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
17d60 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
17d70 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
17d80 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
17d90 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
17da0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17db0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
17dc0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
17dd0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
17de0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
17df0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
17e00 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
17e10 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
17e20 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
17e30 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
17e40 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nFin==0 ){.     
17e50 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
17e60 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
17e70 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
17e80 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
17e90 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
17ea0 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a  if nFin is non-z
17eb0 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
17ec0 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
17ed0 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
17ee0 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
17ef0 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
17f00 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
17f10 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
17f20 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
17f30 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
17f40 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
17f50 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
17f60 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17f70 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
17f80 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
17f90 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
17fa0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
17fb0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
17fc0 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
17fd0 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20  , iLastPg, 1);. 
17fe0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
17ff0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18000 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18010 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18020 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
18030 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
18040 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
18050 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
18060 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
18070 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
18080 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
18090 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
180a0 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
180b0 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
180c0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
180d0 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20  stPg;..      rc 
180e0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
180f0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
18100 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
18110 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18120 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
18130 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
18140 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46  ..      /* If nF
18150 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  in is zero, this
18160 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
18170 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
18180 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
18190 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
181a0 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
181b0 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
181c0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
181d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
181e0 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
181f0 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20  and, if nFin is 
18200 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
18210 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
18220 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
18230 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
18240 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
18250 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
18260 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
18270 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
18280 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
18290 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
182a0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
182b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
182c0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
182d0 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
182e0 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a  iFreePg, 0, 0);.
182f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
18300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18310 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
18320 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
18330 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
18340 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18350 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18360 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
18370 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20  }while( nFin!=0 
18380 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
18390 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
183a0 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
183b0 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
183c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
183d0 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d  erWrite(pLastPg-
183e0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
183f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18400 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
18410 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
18420 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
18430 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
18440 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29  FreePg, nFin!=0)
18450 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18460 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
18470 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tPg);.      if( 
18480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18490 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
184a0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
184b0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69  }.  }..  if( nFi
184c0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73  n==0 ){.    iLas
184d0 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65  tPg--;.    while
184e0 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
184f0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
18500 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45  )||PTRMAP_ISPAGE
18510 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
18520 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54 52 4d  {.      if( PTRM
18530 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
18540 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
18550 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 3b     MemPage *pPg;
18560 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
18570 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
18580 69 4c 61 73 74 50 67 2c 20 26 70 50 67 2c 20 30  iLastPg, &pPg, 0
18590 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
185a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
185b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
185c0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
185d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
185e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
185f0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
18600 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
18610 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69  (pPg);.        i
18620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
18640 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
18650 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
18660 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
18670 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
18680 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
18690 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61  pBt->pPager, iLa
186a0 73 74 50 67 29 3b 0a 20 20 20 20 70 42 74 2d 3e  stPg);.    pBt->
186b0 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
186c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
186d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
186e0 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
186f0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70  ction must be op
18700 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ened before call
18710 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
18720 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d  n..** It perform
18730 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20  s a single unit 
18740 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20  of work towards 
18750 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
18760 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  acuum..**.** If 
18770 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
18780 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68  vacuum is finish
18790 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ed after this fu
187a0 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a  nction has run,.
187b0 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  ** SQLITE_DONE i
187c0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
187d0 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65  t is not finishe
187e0 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  d, but no error 
187f0 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c  occurred,.** SQL
18800 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
18810 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e  ed. Otherwise an
18820 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
18830 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  de. .*/.int sqli
18840 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
18850 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  um(Btree *p){.  
18860 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
18870 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
18880 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
18890 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
188a0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
188b0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
188c0 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61  RITE && p->inTra
188d0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
188e0 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61  );.  if( !pBt->a
188f0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
18900 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
18910 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
18920 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
18930 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
18940 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61  .    rc = incrVa
18950 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c  cuumStep(pBt, 0,
18960 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
18970 70 42 74 29 29 3b 0a 20 20 20 20 69 66 28 20 72  pBt));.    if( r
18980 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18990 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
189a0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
189b0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
189c0 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
189d0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
189e0 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
189f0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  >nPage);.    }. 
18a00 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
18a10 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18a20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18a30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
18a40 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
18a50 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
18a60 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73  mit when a trans
18a70 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d  action.** is com
18a80 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  mited for an aut
18a90 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
18aa0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
18ab0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
18ac0 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
18ad0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
18ae0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
18af0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
18b00 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
18b10 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
18b20 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
18b30 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
18b40 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
18b50 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
18b60 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
18b70 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
18b80 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
18b90 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
18ba0 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
18bb0 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
18bc0 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
18bd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
18be0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
18bf0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
18c00 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
18c10 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
18c20 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
18c30 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
18c40 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
18c50 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
18c60 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
18c70 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
18c80 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
18c90 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
18ca0 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
18cb0 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
18cc0 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Fin;         /* 
18cd0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
18ce0 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65  in database afte
18cf0 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20  r autovacuuming 
18d00 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  */.    Pgno nFre
18d10 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  e;        /* Num
18d20 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
18d30 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69  the freelist ini
18d40 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67  tially */.    Pg
18d50 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20  no nPtrmap;     
18d60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74   /* Number of Pt
18d70 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65  rMap pages to be
18d80 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67   freed */.    Pg
18d90 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20  no iFree;       
18da0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67   /* The next pag
18db0 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  e to be freed */
18dc0 0a 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b  .    int nEntry;
18dd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18de0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
18df0 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20  one ptrmap page 
18e00 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  */.    Pgno nOri
18e10 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  g;        /* Dat
18e20 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72  abase size befor
18e30 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20  e freeing */..  
18e40 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50    nOrig = btreeP
18e50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
18e60 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
18e70 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
18e80 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49   || nOrig==PENDI
18e90 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
18ea0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  ) ){.      /* It
18eb0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
18ec0 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74   to create a dat
18ed0 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20  abase for which 
18ee0 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20  the final page. 
18ef0 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
18f00 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  r a pointer-map 
18f10 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64  page or the pend
18f20 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49  ing-byte page. I
18f30 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  f one.      ** i
18f40 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
18f50 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f  his indicates co
18f60 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
18f70 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
18f80 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18f90 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
18fa0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
18fb0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
18fc0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e  Data[36]);.    n
18fd0 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61  Entry = pBt->usa
18fe0 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 20 20 6e  bleSize/5;.    n
18ff0 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d  Ptrmap = (nFree-
19000 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47  nOrig+PTRMAP_PAG
19010 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b  ENO(pBt, nOrig)+
19020 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a  nEntry)/nEntry;.
19030 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67      nFin = nOrig
19040 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
19050 61 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72 69  ap;.    if( nOri
19060 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
19070 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
19080 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  <PENDING_BYTE_PA
19090 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
190a0 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20   nFin--;.    }. 
190b0 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
190c0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
190d0 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
190e0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
190f0 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e  t) ){.      nFin
19100 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  --;.    }.    if
19110 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72  ( nFin>nOrig ) r
19120 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
19130 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20  RUPT_BKPT;..    
19140 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b  for(iFree=nOrig;
19150 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72   iFree>nFin && r
19160 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46  c==SQLITE_OK; iF
19170 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ree--){.      rc
19180 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
19190 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72  p(pBt, nFin, iFr
191a0 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ee);.    }.    i
191b0 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  f( (rc==SQLITE_D
191c0 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ONE || rc==SQLIT
191d0 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30  E_OK) && nFree>0
191e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
191f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
19200 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
19210 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
19220 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
19230 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
19240 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
19250 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
19260 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
19270 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
19280 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
19290 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20  ta[28], nFin);. 
192a0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
192b0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
192c0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e  Bt->pPager, nFin
192d0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
192e0 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  age = nFin;.    
192f0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
19300 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19310 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
19320 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
19330 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
19340 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65  rt( nRef==sqlite
19350 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
19360 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
19370 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20  rn rc;.}..#else 
19380 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
19390 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
193a0 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74   */.# define set
193b0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20  ChildPtrmaps(x) 
193c0 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
193d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
193e0 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
193f0 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74  rst phase of a t
19400 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e  wo-phase commit.
19410 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
19420 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62  * causes a rollb
19430 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  ack journal to b
19440 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74  e created (if it
19450 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
19460 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20  y exist).** and 
19470 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65  populated with e
19480 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f  nough informatio
19490 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70  n so that if a p
194a0 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73  ower loss occurs
194b0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
194c0 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
194d0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
194e0 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e   state by playin
194f0 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f  g back.** the jo
19500 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65  urnal.  Then the
19510 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
19520 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75   journal are flu
19530 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74  shed out to.** t
19540 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20  he disk.  After 
19550 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
19560 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20  afely on oxide, 
19570 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
19580 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61  he.** database a
19590 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
195a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
195b0 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f  e and flushed to
195c0 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68   oxide..** At th
195d0 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61  e end of this ca
195e0 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ll, the rollback
195f0 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65   journal still e
19600 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  xists on the.** 
19610 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20  disk and we are 
19620 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c  still holding al
19630 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20  l locks, so the 
19640 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
19650 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  not.** committed
19660 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74  .  See sqlite3Bt
19670 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
19680 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f  o() for the seco
19690 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a  nd phase of the.
196a0 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  ** commit proces
196b0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  s..**.** This ca
196c0 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ll is a no-op if
196d0 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
196e0 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  ction is current
196f0 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74  ly active on pBt
19700 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
19710 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  e, sync the data
19720 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
19730 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61  e btree pBt. zMa
19740 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  ster points to.*
19750 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
19760 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19770 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
19780 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
19790 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
197a0 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  l journal file, 
197b0 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69  or is NULL, indi
197c0 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72  cating no master
197d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
197e0 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61  * (single databa
197f0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
19800 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
19810 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
19820 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73  master journal s
19830 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61  hould already ha
19840 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74  ve been.** creat
19850 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ed, populated wi
19860 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  th this journal 
19870 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63  pointer and sync
19880 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
19890 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72  * Once this is r
198a0 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72  outine has retur
198b0 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68  ned, the only th
198c0 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20  ing required to 
198d0 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72  commit.** the wr
198e0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
198f0 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
19900 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c  e file is to del
19910 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
19920 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19930 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
19940 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e  ne(Btree *p, con
19950 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
19960 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
19970 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
19980 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
19990 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
199a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
199b0 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
199c0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
199d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
199e0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
199f0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
19a00 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
19a10 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
19a20 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20  ommit(pBt);.    
19a30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19a40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
19a50 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
19a60 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
19a70 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
19a80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
19a90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19aa0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
19ab0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d  (pBt->pPager, zM
19ac0 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73  aster, 0);.    s
19ad0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
19ae0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
19af0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
19b00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19b10 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68  called from both
19b20 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
19b30 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65  eTwo() and Btree
19b40 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74  Rollback().** at
19b50 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
19b60 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
19b70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19b80 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
19b90 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a  tion(Btree *p){.
19ba0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
19bb0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
19bc0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
19bd0 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
19be0 0a 0a 20 20 62 74 72 65 65 43 6c 65 61 72 48 61  ..  btreeClearHa
19bf0 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
19c00 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
19c10 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 2d  TRANS_NONE && p-
19c20 3e 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43  >db->activeVdbeC
19c30 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  nt>1 ){.    /* I
19c40 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  f there are othe
19c50 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  r active stateme
19c60 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  nts that belong 
19c70 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
19c80 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20  .    ** handle, 
19c90 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72  downgrade to a r
19ca0 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
19cb0 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20  tion. The other 
19cc0 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a  statements.    *
19cd0 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  * may still be r
19ce0 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
19cf0 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20  database.  */.  
19d00 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68    downgradeAllSh
19d10 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
19d20 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69  cks(p);.    p->i
19d30 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52  nTrans = TRANS_R
19d40 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
19d50 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
19d60 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20  le had any kind 
19d70 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
19d80 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
19d90 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  he .    ** trans
19da0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20  action count of 
19db0 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
19dc0 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
19dd0 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20  tion count .    
19de0 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  ** reaches 0, se
19df0 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
19e00 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
19e10 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
19e20 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20  eIfUnused().    
19e30 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69  ** call below wi
19e40 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  ll unlock the pa
19e50 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ger.  */.    if(
19e60 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
19e70 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
19e80 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
19e90 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
19ea0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  );.      pBt->nT
19eb0 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
19ec0 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
19ed0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
19ee0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54          pBt->inT
19ef0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
19f00 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  NS_NONE;.      }
19f10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
19f20 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  et the current t
19f30 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
19f40 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
19f50 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20  nd unlock the . 
19f60 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74     ** pager if t
19f70 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20  his call closed 
19f80 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72  the only read or
19f90 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
19fa0 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69  on.  */.    p->i
19fb0 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
19fc0 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ONE;.    unlockB
19fd0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
19fe0 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
19ff0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a  ntegrity(p);.}..
1a000 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
1a010 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
1a020 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
1a030 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
1a040 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
1a050 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
1a060 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
1a070 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
1a080 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1a090 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75  itPhaseOne() rou
1a0a0 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
1a0b0 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68  rst phase and sh
1a0c0 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  ould.** be invok
1a0d0 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ed prior to call
1a0e0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1a0f0 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  .  The sqlite3Bt
1a100 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1a110 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  e().** routine d
1a120 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20  id all the work 
1a130 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72  of writing infor
1a140 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69  mation out to di
1a150 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20  sk and flushing 
1a160 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1a170 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65  so that they are
1a180 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68   written onto th
1a190 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20  e disk platter. 
1a1a0 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75   All this.** rou
1a1b0 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69  tine has to do i
1a1c0 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e  s delete or trun
1a1d0 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
1a1e0 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a   header in the.*
1a1f0 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
1a200 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61  ournal (which ca
1a210 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
1a220 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
1a230 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b  and.** drop lock
1a240 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  s..**.** Normall
1a250 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  y, if an error o
1a260 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
1a270 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20 61  pager layer is a
1a280 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a  ttempting to .**
1a290 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e   finalize the un
1a2a0 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  derlying journal
1a2b0 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63   file, this func
1a2c0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
1a2d0 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65  error and.** the
1a2e0 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
1a2f0 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c  l attempt a roll
1a300 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  back. However, i
1a310 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
1a320 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d  ument.** is non-
1a330 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62  zero then this b
1a340 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f  -tree transactio
1a350 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d  n is part of a m
1a360 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72  ulti-file .** tr
1a370 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
1a380 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72 61  is case, the tra
1a390 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
1a3a0 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74  eady been commit
1a3b0 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65  ted .** (by dele
1a3c0 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ting a master jo
1a3d0 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
1a3e0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
1a3f0 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  ignore this .** 
1a400 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
1a410 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20   code. So, even 
1a420 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
1a430 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  rs in the pager 
1a440 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20  layer,.** reset 
1a450 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
1a460 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  ts internal stat
1a470 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  e to indicate th
1a480 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20  at the write.** 
1a490 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1a4a0 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69  been closed. Thi
1a4b0 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65 2c  s is quite safe,
1a4c0 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77 69   as the pager wi
1a4d0 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73  ll have.** trans
1a4e0 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65  itioned to the e
1a4f0 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  rror state..**.*
1a500 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
1a510 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
1a520 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1a530 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
1a540 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
1a550 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
1a560 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
1a570 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
1a580 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1a590 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
1a5a0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c  tree *p, int bCl
1a5b0 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70  eanup){..  if( p
1a5c0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1a5d0 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53  _NONE ) return S
1a5e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
1a5f0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1a600 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
1a610 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
1a620 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
1a630 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1a640 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20  on open, commit 
1a650 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
1a660 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  s .  ** transact
1a670 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20  ion and set the 
1a680 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
1a690 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f  TRANS_READ..  */
1a6a0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1a6b0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1a6c0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1a6d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1a6e0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
1a6f0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1a700 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1a710 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
1a720 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
1a730 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
1a740 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a750 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
1a760 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
1a770 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a780 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d  _OK && bCleanup=
1a790 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1a7a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1a7b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1a7c0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
1a7d0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1a7e0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1a7f0 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
1a800 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
1a810 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1a820 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
1a830 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1a840 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
1a850 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
1a860 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a870 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
1a880 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1a890 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1a8a0 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
1a8b0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1a8c0 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
1a8d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a8e0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1a8f0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1a900 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a  PhaseTwo(p, 0);.
1a910 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
1a920 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1a930 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
1a940 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
1a950 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1a960 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73  er of write-curs
1a970 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
1a980 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
1a990 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
1a9a0 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
1a9b0 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
1a9c0 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
1a9d0 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
1a9e0 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  defined..**.** F
1a9f0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
1aa00 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
1aa10 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
1aa20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
1aa30 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
1aa40 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74   of writing to t
1aa50 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61  he databse.  Tha
1aa60 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73  t means the curs
1aa70 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e  or was.** origin
1aa80 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ally opened for 
1aa90 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20  writing and the 
1aaa0 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62  cursor has not b
1aab0 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79  e disabled.** by
1aac0 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74   having its stat
1aad0 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52  e changed to CUR
1aae0 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74  SOR_FAULT..*/.st
1aaf0 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72  atic int countWr
1ab00 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61  iteCursors(BtSha
1ab10 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
1ab20 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
1ab30 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
1ab40 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
1ab50 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
1ab60 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
1ab70 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  if( pCur->wrFlag
1ab80 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
1ab90 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
1aba0 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
1abb0 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
1abc0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1abd0 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
1abe0 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
1abf0 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
1ac00 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
1ac10 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
1ac20 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64  rsor on BtShared
1ac30 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
1ac40 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
1ac50 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
1ac60 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  s tripped, inclu
1ac70 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61  ding cursors tha
1ac80 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f  t belong.** to o
1ac90 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1aca0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
1acb0 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72  appen to be shar
1acc0 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ing.** the cache
1acd0 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
1ace0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1acf0 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
1ad00 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
1ad10 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  urs..** All curs
1ad20 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61  ors using the sa
1ad30 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  me cache must be
1ad40 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70   tripped.** to p
1ad50 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
1ad60 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
1ad70 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a  he btree after.*
1ad80 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  * the rollback. 
1ad90 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
1ada0 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74  y have deleted t
1adb0 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65  ables.** or move
1adc0 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f  d root pages, so
1add0 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
1ade0 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65  cient to.** save
1adf0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
1ae00 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63  e cursor.  The c
1ae10 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  ursor must be.**
1ae20 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
1ae30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1ae40 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1ae50 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
1ae60 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20  int errCode){.  
1ae70 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
1ae80 66 28 20 70 42 74 72 65 65 3d 3d 30 20 29 20 72  f( pBtree==0 ) r
1ae90 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
1aea0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
1aeb0 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  e);.  for(p=pBtr
1aec0 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
1aed0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1aee0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1aef0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1af00 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
1af10 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
1af20 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70  SOR_FAULT;.    p
1af30 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72  ->skipNext = err
1af40 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Code;.    for(i=
1af50 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20  0; i<=p->iPage; 
1af60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
1af70 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67  asePage(p->apPag
1af80 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e[i]);.      p->
1af90 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
1afa0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1afb0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
1afc0 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ree);.}../*.** R
1afd0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
1afe0 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
1aff0 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72  ess.  All cursor
1b000 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76  s will be.** inv
1b010 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f  alided by this o
1b020 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61  peration.  Any a
1b030 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
1b040 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77  cursor.** that w
1b050 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62  as open at the b
1b060 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73  eginning of this
1b070 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20   operation will 
1b080 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20  result.** in an 
1b090 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
1b0a0 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
1b0b0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
1b0c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b0d0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
1b0e0 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
1b0f0 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
1b100 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
1b110 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
1b120 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
1b130 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ack(Btree *p, in
1b140 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69  t tripCode){.  i
1b150 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1b160 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1b170 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1b180 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  e1;..  sqlite3Bt
1b190 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
1b1a0 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  f( tripCode==SQL
1b1b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1b1c0 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61   = tripCode = sa
1b1d0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1b1e0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
1b1f0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1b200 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1b210 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20  tripCode ){.    
1b220 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
1b230 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72  AllCursors(p, tr
1b240 69 70 43 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 62  ipCode);.  }.  b
1b250 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1b260 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
1b270 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1b280 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
1b290 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
1b2a0 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
1b2b0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
1b2c0 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
1b2d0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1b2e0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
1b2f0 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
1b300 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1b310 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
1b320 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
1b330 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
1b340 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
1b350 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
1b360 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
1b370 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
1b380 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
1b390 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
1b3a0 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
1b3b0 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
1b3c0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
1b3d0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
1b3e0 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
1b3f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b400 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65    int nPage = ge
1b410 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
1b420 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
1b430 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
1b440 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
1b450 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20   if( nPage==0 ) 
1b460 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1b470 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1b480 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
1b490 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d    testcase( pBt-
1b4a0 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b  >nPage!=nPage );
1b4b0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1b4c0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
1b4d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1b4e0 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
1b4f0 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
1b500 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
1b510 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
1b520 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1b530 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
1b540 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
1b550 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
1b560 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1b570 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b580 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73  ./*.** Start a s
1b590 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
1b5a0 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
1b5b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20  transaction can 
1b5c0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a  can be rolled.**
1b5d0 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
1b5e0 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
1b5f0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75  transaction. You
1b600 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
1b610 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65  ansaction .** be
1b620 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
1b630 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
1b640 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
1b650 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f  on is ended auto
1b660 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66  matically .** if
1b670 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
1b680 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72  ction commits or
1b690 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
1b6a0 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
1b6b0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1b6c0 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
1b6d0 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
1b6e0 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
1b6f0 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
1b700 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
1b710 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
1b720 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
1b730 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
1b740 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
1b750 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
1b760 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
1b770 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
1b780 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
1b790 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
1b7a0 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
1b7b0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1b7c0 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73  ** A statement s
1b7d0 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ub-transaction i
1b7e0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
1b7f0 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61   an anonymous sa
1b800 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20  vepoint. The.** 
1b810 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
1b820 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
1b830 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61  eter is the tota
1b840 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  l number of save
1b850 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75  points,.** inclu
1b860 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f  ding the new ano
1b870 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
1b880 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d  , open on the B-
1b890 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68  Tree. i.e. if th
1b8a0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1b8b0 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
1b8c0 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61  and no other sta
1b8d0 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
1b8e0 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74  ons open,.** iSt
1b8f0 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68  atement is 1. Th
1b900 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  is anonymous sav
1b910 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65  epoint can be re
1b920 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64  leased or rolled
1b930 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74   back.** using t
1b940 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
1b950 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74  avepoint() funct
1b960 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
1b970 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
1b980 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
1b990 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69  iStatement){.  i
1b9a0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1b9b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1b9c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1b9d0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
1b9e0 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
1b9f0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1ba00 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74  assert( (pBt->bt
1ba10 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
1ba20 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20  D_ONLY)==0 );.  
1ba30 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
1ba40 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
1ba50 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e  ( iStatement>p->
1ba60 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  db->nSavepoint )
1ba70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1ba80 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1ba90 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1baa0 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
1bab0 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
1bac0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1bad0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
1bae0 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ith.  ** an inde
1baf0 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  x greater than a
1bb00 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72  ll savepoints cr
1bb10 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79  eated explicitly
1bb20 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20   using.  ** SQL 
1bb30 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
1bb40 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65  s illegal to ope
1bb50 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
1bb60 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20  llback any.  ** 
1bb70 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20  such savepoints 
1bb80 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d  while the statem
1bb90 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1bba0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
1bbb0 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ive..  */.  rc =
1bbc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1bbd0 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
1bbe0 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
1bbf0 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nt);.  sqlite3Bt
1bc00 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1bc10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1bc20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
1bc30 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
1bc40 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
1bc50 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
1bc60 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
1bc70 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1bc80 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
1bc90 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
1bca0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
1bcb0 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
1bcc0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
1bcd0 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
1bce0 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
1bcf0 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
1bd00 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
1bd10 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
1bd20 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1bd30 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
1bd40 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
1bd50 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
1bd60 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
1bd70 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
1bd80 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
1bd90 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
1bda0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1bdb0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
1bdc0 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
1bdd0 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
1bde0 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
1bdf0 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
1be00 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
1be10 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
1be20 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
1be30 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
1be40 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
1be50 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
1be60 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
1be70 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
1be80 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
1be90 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1bea0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
1beb0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1bec0 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
1bed0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1bee0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
1bef0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
1bf00 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
1bf10 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
1bf20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
1bf30 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
1bf40 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
1bf50 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
1bf60 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
1bf70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1bf80 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d  ter(p);.    rc =
1bf90 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
1bfa0 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1bfb0 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69  er, op, iSavepoi
1bfc0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  nt);.    if( rc=
1bfd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bfe0 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69      if( iSavepoi
1bff0 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74  nt<0 && (pBt->bt
1c000 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49  sFlags & BTS_INI
1c010 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30  TIALLY_EMPTY)!=0
1c020 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
1c030 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >nPage = 0;.    
1c040 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e    }.      rc = n
1c050 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
1c060 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1c070 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20  e = get4byte(28 
1c080 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  + pBt->pPage1->a
1c090 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
1c0a0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1c0b0 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  ze was written i
1c0c0 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32  nto the offset 2
1c0d0 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a  8 of the header.
1c0e0 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68        ** when th
1c0f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
1c100 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f  arted, so we kno
1c110 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65  w that the value
1c120 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20   at offset.     
1c130 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72   ** 28 is nonzer
1c140 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  o. */.      asse
1c150 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30  rt( pBt->nPage>0
1c160 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
1c170 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1c180 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
1c190 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
1c1a0 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
1c1b0 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
1c1c0 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
1c1d0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
1c1e0 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f  ble. If a read-o
1c1f0 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65  nly cursor is re
1c200 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61  quested, it is a
1c210 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74  ssumed that.** t
1c220 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64  he caller alread
1c230 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61  y has at least a
1c240 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
1c250 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f  action open.** o
1c260 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
1c270 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69  lready. If a wri
1c280 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71  te-cursor is req
1c290 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20  uested, then.** 
1c2a0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73  the caller is as
1c2b0 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e  sumed to have an
1c2c0 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
1c2d0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  saction..**.** I
1c2e0 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65  f wrFlag==0, the
1c2f0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
1c300 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f   only be used fo
1c310 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66  r reading..** If
1c320 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e   wrFlag==1, then
1c330 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
1c340 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
1c350 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72  ing or for.** wr
1c360 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
1c370 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
1c380 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d  iting are also m
1c390 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72  et.  These.** ar
1c3a0 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
1c3b0 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
1c3c0 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77  t in order for w
1c3d0 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20  riting to.** be 
1c3e0 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
1c3f0 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
1c400 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
1c410 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
1c420 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  =1.**.** 2:  Oth
1c430 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1c440 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
1c450 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
1c460 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
1c470 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
1c480 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
1c490 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
1c4a0 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
1c4b0 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
1c4c0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
1c4d0 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
1c4e0 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
1c4f0 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
1c500 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
1c510 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
1c520 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
1c530 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
1c540 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
1c550 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
1c560 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
1c570 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
1c580 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
1c590 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
1c5a0 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
1c5b0 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
1c5c0 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
1c5d0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  action..**.** No
1c5e0 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
1c5f0 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
1c600 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
1c610 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
1c620 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
1c630 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
1c640 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
1c650 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
1c660 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
1c670 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a   correctly..**.*
1c680 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
1c690 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
1c6a0 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
1c6b0 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  ) has been calle
1c6c0 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20  d.** on pCur to 
1c6d0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
1c6e0 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f  emory space prio
1c6f0 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
1c700 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  is routine..*/.s
1c710 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
1c720 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
1c730 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c750 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
1c760 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c780 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
1c790 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
1c7a0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
1c7b0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
1c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7d0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
1c7e0 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
1c7f0 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
1c800 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
1c810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1c820 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
1c830 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
1c840 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1c850 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1c860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
1c870 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
1c880 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  r */.){.  BtShar
1c890 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1c8a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c8b0 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65   /* Shared b-tre
1c8c0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61  e handle */..  a
1c8d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1c8e0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1c8f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
1c900 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61  Flag==0 || wrFla
1c910 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  g==1 );..  /* Th
1c920 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1c930 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65  rt statements ve
1c940 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69  rify that if thi
1c950 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20  s is a sharable 
1c960 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74  .  ** b-tree dat
1c970 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65  abase, the conne
1c980 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
1c990 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
1c9a0 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a  ble locks, .  **
1c9b0 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68   and that no oth
1c9c0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
1c9d0 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  s any open curso
1c9e0 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  r that conflicts
1c9f0 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73   with .  ** this
1ca00 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
1ca10 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
1ca20 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
1ca30 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f  iTable, pKeyInfo
1ca40 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29  !=0, wrFlag+1) )
1ca50 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1ca60 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61  ag==0 || !hasRea
1ca70 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54  dConflicts(p, iT
1ca80 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41  able) );..  /* A
1ca90 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63  ssert that the c
1caa0 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64  aller has opened
1cab0 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72   the required tr
1cac0 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20  ansaction. */.  
1cad0 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
1cae0 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  ns>TRANS_NONE );
1caf0 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
1cb00 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61  g==0 || p->inTra
1cb10 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1cb20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1cb30 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d  ->pPage1 && pBt-
1cb40 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
1cb50 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 77  ;..  if( NEVER(w
1cb60 72 46 6c 61 67 20 26 26 20 28 70 42 74 2d 3e 62  rFlag && (pBt->b
1cb70 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1cb80 41 44 5f 4f 4e 4c 59 29 21 3d 30 29 20 29 7b 0a  AD_ONLY)!=0) ){.
1cb90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1cba0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
1cbb0 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
1cbc0 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  && btreePagecoun
1cbd0 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20  t(pBt)==0 ){.   
1cbe0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1cbf0 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65  =0 );.    iTable
1cc00 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1cc10 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  Now that no othe
1cc20 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63  r errors can occ
1cc30 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69  ur, finish filli
1cc40 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73  ng in the BtCurs
1cc50 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  or.  ** variable
1cc60 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63  s and link the c
1cc70 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
1cc80 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a  tShared list.  *
1cc90 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  /.  pCur->pgnoRo
1cca0 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c  ot = (Pgno)iTabl
1ccb0 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  e;.  pCur->iPage
1ccc0 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70   = -1;.  pCur->p
1ccd0 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
1cce0 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72  fo;.  pCur->pBtr
1ccf0 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e  ee = p;.  pCur->
1cd00 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75  pBt = pBt;.  pCu
1cd10 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38 29  r->wrFlag = (u8)
1cd20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e  wrFlag;.  pCur->
1cd30 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
1cd40 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72  rsor;.  if( pCur
1cd50 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
1cd60 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
1cd70 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20  v = pCur;.  }.  
1cd80 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
1cd90 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
1cda0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
1cdb0 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63 61  ALID;.  pCur->ca
1cdc0 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a 20  chedRowid = 0;. 
1cdd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1cde0 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
1cdf0 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
1ce00 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
1ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ce30 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
1ce40 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
1ce70 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
1ce80 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
1ce90 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
1cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ceb0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
1cec0 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
1ced0 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
1cee0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1cef0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1cf00 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
1cf10 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
1cf20 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
1cf30 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
1cf60 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
1cf70 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1cf80 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1cf90 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72  .  rc = btreeCur
1cfa0 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
1cfb0 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
1cfc0 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65   pCur);.  sqlite
1cfd0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1cfe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1cff0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1d000 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72   size of a BtCur
1d010 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79  sor object in by
1d020 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tes..**.** This 
1d030 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65  interfaces is ne
1d040 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65  eded so that use
1d050 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61  rs of cursors ca
1d060 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a  n preallocate.**
1d070 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72   sufficient stor
1d080 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75  age to hold a cu
1d090 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72  rsor.  The BtCur
1d0a0 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  sor object is op
1d0b0 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73  aque.** to users
1d0c0 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   so they cannot 
1d0d0 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20  do the sizeof() 
1d0e0 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65  themselves - the
1d0f0 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74  y must call.** t
1d100 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
1d110 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1d120 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29  CursorSize(void)
1d130 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44  {.  return ROUND
1d140 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f  8(sizeof(BtCurso
1d150 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  r));.}../*.** In
1d160 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
1d170 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  that will be con
1d180 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74  verted into a Bt
1d190 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a  Cursor object..*
1d1a0 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20  *.** The simple 
1d1b0 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f  approach here wo
1d1c0 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74  uld be to memset
1d1d0 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62  () the entire ob
1d1e0 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e  ject.** to zero.
1d1f0 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f    But it turns o
1d200 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61  ut that the apPa
1d210 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d  ge[] and aiIdx[]
1d220 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f   arrays.** do no
1d230 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72  t need to be zer
1d240 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65  oed and they are
1d250 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61   large, so we ca
1d260 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20  n save a lot.** 
1d270 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73  of run-time by s
1d280 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74  kipping the init
1d290 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
1d2a0 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f  ose elements..*/
1d2b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1d2c0 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43  eeCursorZero(BtC
1d2d0 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d  ursor *p){.  mem
1d2e0 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74  set(p, 0, offset
1d2f0 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61  of(BtCursor, iPa
1d300 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ge));.}../*.** S
1d310 65 74 20 74 68 65 20 63 61 63 68 65 64 20 72 6f  et the cached ro
1d320 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65 76 65  wid value of eve
1d330 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74 68 65  ry cursor in the
1d340 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
1d350 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72 20 61  ile.** as pCur a
1d360 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20 73 61  nd having the sa
1d370 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  me root page num
1d380 62 65 72 20 61 73 20 70 43 75 72 2e 20 20 54 68  ber as pCur.  Th
1d390 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65  e value is.** se
1d3a0 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a  t to iRowid..**.
1d3b0 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65  ** Only positive
1d3c0 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20 61 72   rowid values ar
1d3d0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61 6c  e considered val
1d3e0 69 64 20 66 6f 72 20 74 68 69 73 20 63 61 63 68  id for this cach
1d3f0 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68 65 20  e..** The cache 
1d400 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
1d410 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74 69  o zero, indicati
1d420 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20 63 61  ng an invalid ca
1d430 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20  che..** A btree 
1d440 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77  will work fine w
1d450 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61  ith zero or nega
1d460 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20 57 65  tive rowids.  We
1d470 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20   just cannot.** 
1d480 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65  cache zero or ne
1d490 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c 20 77  gative rowids, w
1d4a0 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62 6c 65  hich means table
1d4b0 73 20 74 68 61 74 20 75 73 65 20 7a 65 72 6f 20  s that use zero 
1d4c0 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20 72  or.** negative r
1d4d0 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75 6e 20  owids might run 
1d4e0 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
1d4f0 20 20 42 75 74 20 69 6e 20 70 72 61 63 74 69 63    But in practic
1d500 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65  e, zero.** or ne
1d510 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 61 72  gative rowids ar
1d520 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20  e very uncommon 
1d530 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  so this should n
1d540 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
1d550 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d560 42 74 72 65 65 53 65 74 43 61 63 68 65 64 52 6f  BtreeSetCachedRo
1d570 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  wid(BtCursor *pC
1d580 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ur, sqlite3_int6
1d590 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42 74 43  4 iRowid){.  BtC
1d5a0 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28  ursor *p;.  for(
1d5b0 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75  p=pCur->pBt->pCu
1d5c0 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1d5d0 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1d5e0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d  >pgnoRoot==pCur-
1d5f0 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63  >pgnoRoot ) p->c
1d600 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69 52 6f  achedRowid = iRo
1d610 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  wid;.  }.  asser
1d620 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  t( pCur->cachedR
1d630 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a  owid==iRowid );.
1d640 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1d650 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64  the cached rowid
1d660 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
1d670 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61 74 69  ursor.  A negati
1d680 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65  ve or zero.** re
1d690 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
1d6a0 61 74 65 73 20 74 68 61 74 20 74 68 65 20 72 6f  ates that the ro
1d6b0 77 69 64 20 63 61 63 68 65 20 69 73 20 69 6e 76  wid cache is inv
1d6c0 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20  alid and should 
1d6d0 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  be.** ignored.  
1d6e0 49 66 20 74 68 65 20 72 6f 77 69 64 20 63 61 63  If the rowid cac
1d6f0 68 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 66  he has never bef
1d700 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20 74 68  ore been set, th
1d710 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20  en a.** zero is 
1d720 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c  returned..*/.sql
1d730 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74  ite3_int64 sqlit
1d740 65 33 42 74 72 65 65 47 65 74 43 61 63 68 65 64  e3BtreeGetCached
1d750 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
1d760 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
1d770 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69  pCur->cachedRowi
1d780 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  d;.}../*.** Clos
1d790 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
1d7a0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
1d7b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1d7c0 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
1d7d0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
1d7e0 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
1d7f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1d800 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
1d810 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1d820 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
1d830 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
1d840 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
1d850 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
1d860 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
1d870 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
1d880 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1d890 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Btree);.    sqli
1d8a0 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
1d8b0 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69  sor(pCur);.    i
1d8c0 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
1d8d0 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  {.      pCur->pP
1d8e0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
1d8f0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
1d900 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  lse{.      pBt->
1d910 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
1d920 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
1d930 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
1d940 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1d950 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
1d960 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  Cur->pPrev;.    
1d970 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
1d980 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
1d990 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
1d9a0 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
1d9b0 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
1d9c0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1d9d0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
1d9e0 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
1d9f0 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a  lowCache(pCur);.
1da00 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66      /* sqlite3_f
1da10 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20  ree(pCur); */.  
1da20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1da30 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
1da40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1da50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
1da60 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
1da70 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
1da80 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
1da90 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
1daa0 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
1dab0 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
1dac0 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
1dad0 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61   call.** btreePa
1dae0 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
1daf0 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
1db00 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
1db10 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
1db20 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
1db30 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
1db40 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
1db50 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
1db60 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
1db70 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
1db80 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d  l()..**.** 2007-
1db90 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73  06-25:  There is
1dba0 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76   a bug in some v
1dbb0 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20  ersions of MSVC 
1dbc0 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a  that cause the.*
1dbd0 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72  * compiler to cr
1dbe0 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c  ash when getCell
1dbf0 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d  Info() is implem
1dc00 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f  ented as a macro
1dc10 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69  ..** But there i
1dc20 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20  s a measureable 
1dc30 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20  speed advantage 
1dc40 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63  to using the mac
1dc50 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68  ro on gcc.** (wh
1dc60 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72  en less compiler
1dc70 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c   optimizations l
1dc80 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61  ike -Os or -O0 a
1dc90 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  re used and the.
1dca0 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e  ** compiler is n
1dcb0 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69  ot doing agressi
1dcc0 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53  ve inlining.)  S
1dcd0 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20  o we use a real 
1dce0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  function.** for 
1dcf0 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f  MSVC and a macro
1dd00 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20   for everything 
1dd10 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32  else.  Ticket #2
1dd20 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  457..*/.#ifndef 
1dd30 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
1dd40 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49  void assertCellI
1dd50 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
1dd60 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  ur){.    CellInf
1dd70 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  o info;.    int 
1dd80 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
1dd90 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  age;.    memset(
1dda0 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  &info, 0, sizeof
1ddb0 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72  (info));.    btr
1ddc0 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1ddd0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1dde0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61   pCur->aiIdx[iPa
1ddf0 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ge], &info);.   
1de00 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28   assert( memcmp(
1de10 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e  &info, &pCur->in
1de20 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
1de30 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  )==0 );.  }.#els
1de40 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65  e.  #define asse
1de50 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65  rtCellInfo(x).#e
1de60 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43  ndif.#ifdef _MSC
1de70 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20  _VER.  /* Use a 
1de80 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e  real function in
1de90 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72   MSVC to work ar
1dea0 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61  ound bugs in tha
1deb0 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20  t compiler. */. 
1dec0 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74   static void get
1ded0 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
1dee0 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66  r *pCur){.    if
1def0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
1df00 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ze==0 ){.      i
1df10 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1df20 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62 74  >iPage;.      bt
1df30 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1df40 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1df50 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
1df60 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
1df70 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61  ;.      pCur->va
1df80 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
1df90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1dfa0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
1dfb0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  r);.    }.  }.#e
1dfc0 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d  lse /* if not _M
1dfd0 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55  SC_VER */.  /* U
1dfe0 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c  se a macro in al
1dff0 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72  l other compiler
1e000 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75  s so that the fu
1e010 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65  nction is inline
1e020 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74  d */.#define get
1e030 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20  CellInfo(pCur)  
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e070 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72      \.  if( pCur
1e080 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
1e090 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
1e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0c0 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69       \.    int i
1e0d0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1e0e0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e110 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72 65        \.    btre
1e120 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
1e130 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
1e140 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
1e150 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20  ],&pCur->info); 
1e160 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  \.    pCur->vali
1e170 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20  dNKey = 1;      
1e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1b0 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
1e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e200 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65    \.    assertCe
1e210 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20  llInfo(pCur);   
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e250 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20     \.  }.#endif 
1e260 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a  /* _MSC_VER */..
1e270 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20  #ifndef NDEBUG  
1e280 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74  /* The next rout
1e290 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69  ine used only wi
1e2a0 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
1e2b0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a  atements */./*.*
1e2c0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1e2d0 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72   the given BtCur
1e2e0 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41  sor is valid.  A
1e2f0 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73   valid cursor is
1e300 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20   one.** that is 
1e310 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
1e320 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61  ng to a row in a
1e330 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62   (non-empty) tab
1e340 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  le..** This is a
1e350 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f   verification ro
1e360 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
1e370 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
1e380 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
1e390 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1e3a0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
1e3b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1e3c0 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26  .  return pCur &
1e3d0 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
1e3e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
1e3f0 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
1e400 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a   */../*.** Set *
1e410 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
1e420 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
1e430 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
1e440 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
1e450 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
1e460 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
1e470 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1e480 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
1e490 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
1e4a0 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
1e4b0 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
1e4c0 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
1e4d0 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
1e4e0 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
1e4f0 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
1e500 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
1e510 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1e520 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
1e530 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1e540 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68  must position th
1e550 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74  e cursor prior t
1e560 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
1e570 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20  routine..** .** 
1e580 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
1e590 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c  not fail.  It al
1e5a0 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
1e5b0 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74  ITE_OK.  .*/.int
1e5c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1e5d0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
1e5e0 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
1e5f0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
1e600 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1e610 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1e620 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1e630 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
1e640 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1e650 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1e660 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1e670 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
1e680 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30  {.    *pSize = 0
1e690 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67  ;.  }else{.    g
1e6a0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1e6b0 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70  ;.    *pSize = p
1e6c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
1e6d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1e6e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1e6f0 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
1e700 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1e710 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
1e720 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
1e730 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
1e740 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a  points to..**.**
1e750 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
1e760 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
1e770 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
1e780 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d  inting to a non-
1e790 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e  NULL.** valid en
1e7a0 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  try.  In other w
1e7b0 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ords, the callin
1e7c0 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74  g procedure must
1e7d0 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68   guarantee.** th
1e7e0 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  at the cursor ha
1e7f0 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d  s Cursor.eState=
1e800 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a  =CURSOR_VALID..*
1e810 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20  *.** Failure is 
1e820 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54  not possible.  T
1e830 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
1e840 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
1e850 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67  TE_OK..** It mig
1e860 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20  ht just as well 
1e870 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28  be a procedure (
1e880 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20  returning void) 
1e890 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a  but we continue.
1e8a0 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ** to return an 
1e8b0 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63  integer result c
1e8c0 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ode for historic
1e8d0 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69  al reasons..*/.i
1e8e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
1e8f0 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72  ataSize(BtCursor
1e900 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69   *pCur, u32 *pSi
1e910 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
1e920 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1e930 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1e940 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1e950 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1e960 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
1e970 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d  Cur);.  *pSize =
1e980 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74   pCur->info.nDat
1e990 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  a;.  return SQLI
1e9a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1e9b0 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e  Given the page n
1e9c0 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72  umber of an over
1e9d0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1e9e0 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d   database (param
1e9f0 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74  eter.** ovfl), t
1ea00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
1ea10 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ds the page numb
1ea20 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  er of the next p
1ea30 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  age in the .** l
1ea40 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76  inked list of ov
1ea50 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66  erflow pages. If
1ea60 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73   possible, it us
1ea70 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  es the auto-vacu
1ea80 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61  um.** pointer-ma
1ea90 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f  p data instead o
1eaa0 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f  f reading the co
1eab0 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76  ntent of page ov
1eac0 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a  fl to do so. .**
1ead0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1eae0 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65  occurs an SQLite
1eaf0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1eb00 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1eb10 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  se:.**.** The pa
1eb20 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1eb30 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   next overflow p
1eb40 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  age in the linke
1eb50 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72  d list is .** wr
1eb60 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e  itten to *pPgnoN
1eb70 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66  ext. If page ovf
1eb80 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  l is the last pa
1eb90 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
1eba0 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e   .** list, *pPgn
1ebb0 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
1ebc0 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
1ebd0 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
1ebe0 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65  LL, and a refere
1ebf0 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  nce to the MemPa
1ec00 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73  ge object corres
1ec10 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61  ponding.** to pa
1ec20 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20  ge number pOvfl 
1ec30 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  was obtained, th
1ec40 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  en *ppPage is se
1ec50 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
1ec60 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e  at.** reference.
1ec70 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
1ec80 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
1ec90 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20   caller to call 
1eca0 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a  releasePage().**
1ecb0 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66   on *ppPage to f
1ecc0 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ree the referenc
1ecd0 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e  e. In no referen
1ece0 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ce was obtained 
1ecf0 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
1ed00 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20  pointer-map was 
1ed10 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  used to obtain t
1ed20 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50  he value for *pP
1ed30 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a  gnoNext), then.*
1ed40 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  * *ppPage is set
1ed50 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61   to zero..*/.sta
1ed60 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66  tic int getOverf
1ed70 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61  lowPage(.  BtSha
1ed80 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
1ed90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1eda0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1edb0 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20    Pgno ovfl,    
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1edd0 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c  * Current overfl
1ede0 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
1edf0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
1ee00 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
1ee10 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65   /* OUT: MemPage
1ee20 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20   handle (may be 
1ee30 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20  NULL) */.  Pgno 
1ee40 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20  *pPgnoNext      
1ee50 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1ee60 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  Next overflow pa
1ee70 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
1ee80 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b    Pgno next = 0;
1ee90 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1eea0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  e = 0;.  int rc 
1eeb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1eec0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1eed0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1eee0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1eef0 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a  rt(pPgnoNext);..
1ef00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ef10 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1ef20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
1ef30 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1ef40 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
1ef50 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
1ef60 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
1ef70 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
1ef80 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
1ef90 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
1efa0 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
1efb0 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
1efc0 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
1efd0 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
1efe0 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
1eff0 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
1f000 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
1f010 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
1f020 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
1f030 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
1f040 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
1f050 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
1f060 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1f070 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
1f080 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
1f090 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
1f0a0 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
1f0b0 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
1f0c0 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
1f0d0 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
1f0e0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1f0f0 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
1f100 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
1f110 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65  f( iGuess<=btree
1f120 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
1f130 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
1f140 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
1f150 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
1f160 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
1f170 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
1f180 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1f190 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d  RFLOW2 && pgno==
1f1a0 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ovfl ){.        
1f1b0 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20  next = iGuess;. 
1f1c0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1f1d0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
1f1e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1f1f0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78  f..  assert( nex
1f200 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  t==0 || rc==SQLI
1f210 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
1f220 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f230 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
1f240 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
1f250 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20  l, &pPage, 0);. 
1f260 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
1f270 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
1f280 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e==0 );.    if( 
1f290 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f2a0 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
1f2b0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1f2c0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
1f2d0 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
1f2e0 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61  next;.  if( ppPa
1f2f0 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  ge ){.    *ppPag
1f300 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c  e = pPage;.  }el
1f310 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
1f320 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
1f330 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
1f340 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
1f350 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
1f360 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  /*.** Copy data 
1f370 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f  from a buffer to
1f380 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d   a page, or from
1f390 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66   a page to a buf
1f3a0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c  fer..**.** pPayl
1f3b0 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72  oad is a pointer
1f3c0 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20   to data stored 
1f3d0 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  on database page
1f3e0 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20   pDbPage..** If 
1f3f0 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20  argument eOp is 
1f400 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74  false, then nByt
1f410 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
1f420 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  are copied.** fr
1f430 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74  om pPayload to t
1f440 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
1f450 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66  d at by pBuf. If
1f460 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a   eOp is true,.**
1f470 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   then sqlite3Pag
1f480 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
1f490 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61  led on pDbPage a
1f4a0 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a  nd nByte bytes.*
1f4b0 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  * of data are co
1f4c0 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  pied from the bu
1f4d0 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61  ffer pBuf to pPa
1f4e0 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  yload..**.** SQL
1f4f0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1f500 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f  ed on success, o
1f510 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
1f520 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
1f530 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61  c int copyPayloa
1f540 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c  d(.  void *pPayl
1f550 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  oad,           /
1f560 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
1f570 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  e data */.  void
1f580 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
1f590 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1f5a0 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20   to buffer */.  
1f5b0 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
1f5c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f5d0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1f5e0 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  copy */.  int eO
1f5f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1f600 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79      /* 0 -> copy
1f610 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e   from page, 1 ->
1f620 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f   copy to page */
1f630 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
1f640 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
1f650 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
1f660 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  pPayload */.){. 
1f670 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
1f680 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
1f690 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65  m buffer to page
1f6a0 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74   (a write operat
1f6b0 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion) */.    int 
1f6c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f6d0 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
1f6e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1f6f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f700 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1f710 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
1f720 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74  load, pBuf, nByt
1f730 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
1f740 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
1f750 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65  om page to buffe
1f760 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74  r (a read operat
1f770 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  ion) */.    memc
1f780 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61  py(pBuf, pPayloa
1f790 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  d, nByte);.  }. 
1f7a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f7b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
1f7c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1f7d0 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
1f7e0 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
1f7f0 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
1f800 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
1f810 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
1f820 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
1f830 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70   If the eOp.** p
1f840 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74  arameter is 0, t
1f850 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
1f860 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f  eration (data co
1f870 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66  pied into.** buf
1f880 66 65 72 20 70 42 75 66 29 2e 20 49 66 20 69 74  fer pBuf). If it
1f890 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20   is non-zero, a 
1f8a0 77 72 69 74 65 20 28 64 61 74 61 20 63 6f 70 69  write (data copi
1f8b0 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65  ed from.** buffe
1f8c0 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41  r pBuf)..**.** A
1f8d0 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20   total of "amt" 
1f8e0 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f  bytes are read o
1f8f0 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e  r written beginn
1f900 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ing at "offset".
1f910 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64  .** Data is read
1f920 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20   to or from the 
1f930 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a  buffer pBuf..**.
1f940 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62  ** The content b
1f950 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69  eing read or wri
1f960 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61  tten might appea
1f970 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61  r on the main pa
1f980 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74  ge.** or be scat
1f990 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c  tered out on mul
1f9a0 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70  tiple overflow p
1f9b0 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ages..**.** If t
1f9c0 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e  he BtCursor.isIn
1f9d0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61  crblobHandle fla
1f9e0 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68  g is set, and th
1f9f0 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72  e current.** cur
1fa00 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
1fa10 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
1fa20 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73 20  low pages, this 
1fa30 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f  function.** allo
1fa40 63 61 74 65 73 20 73 70 61 63 65 20 66 6f 72 20  cates space for 
1fa50 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75  and lazily poplu
1fa60 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f  ates the overflo
1fa70 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20  w page-list .** 
1fa80 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43  cache array (BtC
1fa90 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29  ursor.aOverflow)
1faa0 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  . Subsequent cal
1fab0 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63  ls use this.** c
1fac0 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65  ache to make see
1fad0 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  king to the supp
1fae0 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65  lied offset more
1faf0 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
1fb00 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
1fb10 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
1fb20 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
1fb30 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65  cated, it may be
1fb40 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
1fb50 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
1fb60 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
1fb70 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
1fb80 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
1fb90 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
1fba0 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
1fbb0 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
1fbc0 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
1fbd0 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
1fbe0 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
1fbf0 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
1fc00 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1fc10 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
1fc20 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
1fc30 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
1fc40 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
1fc50 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
1fc60 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
1fc70 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
1fc80 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
1fc90 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1fca0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1fcb0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
1fcc0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1fcd0 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
1fce0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
1fcf0 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
1fd00 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  */.  u32 offset,
1fd10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
1fd20 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
1fd30 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
1fd40 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20   */.  u32 amt,  
1fd50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1fd60 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
1fd70 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
1fd80 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
1fd90 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
1fda0 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
1fdb0 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20   */ .  int eOp  
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
1fdd0 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
1fde0 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
1fdf0 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
1fe00 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
1fe10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1fe20 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65  TE_OK;.  u32 nKe
1fe30 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  y;.  int iIdx = 
1fe40 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1fe50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1fe60 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
1fe70 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
1fe80 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
1fe90 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
1fea0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
1feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fec0 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
1fed0 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
1fee0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1fef0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
1ff00 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1ff10 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1ff20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1ff30 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1ff40 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
1ff50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1ff60 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1ff70 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c  ur) );..  getCel
1ff80 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
1ff90 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
1ffa0 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75  info.pCell + pCu
1ffb0 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
1ffc0 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65  .  nKey = (pPage
1ffd0 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28  ->intKey ? 0 : (
1ffe0 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
1fff0 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56  Key);..  if( NEV
20000 45 52 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20  ER(offset+amt > 
20010 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e  nKey+pCur->info.
20020 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c 20 26 61  nData) .   || &a
20030 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
20040 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50  fo.nLocal] > &pP
20050 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
20060 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b  usableSize].  ){
20070 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74  .    /* Trying t
20080 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
20090 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
200a0 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65  the data is an e
200b0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75  rror */.    retu
200c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
200d0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
200e0 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20  * Check if data 
200f0 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69  must be read/wri
20100 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65  tten to/from the
20110 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65   btree page itse
20120 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  lf. */.  if( off
20130 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
20140 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
20150 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
20160 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
20170 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
20180 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
20190 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
201a0 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
201b0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
201c0 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
201d0 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70  t], pBuf, a, eOp
201e0 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  , pPage->pDbPage
201f0 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  );.    offset = 
20200 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61  0;.    pBuf += a
20210 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a  ;.    amt -= a;.
20220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66    }else{.    off
20230 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66  set -= pCur->inf
20240 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20  o.nLocal;.  }.. 
20250 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20260 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
20270 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66     const u32 ovf
20280 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  lSize = pBt->usa
20290 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a  bleSize - 4;  /*
202a0 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70   Bytes content p
202b0 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a  er ovfl page */.
202c0 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67      Pgno nextPag
202d0 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65  e;..    nextPage
202e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61   = get4byte(&aPa
202f0 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
20300 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e  .nLocal]);..#ifn
20310 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20320 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20  INCRBLOB.    /* 
20330 49 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f  If the isIncrblo
20340 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20  bHandle flag is 
20350 73 65 74 20 61 6e 64 20 74 68 65 20 42 74 43 75  set and the BtCu
20360 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
20370 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20  .    ** has not 
20380 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
20390 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e  allocate it now.
203a0 20 54 68 65 20 61 72 72 61 79 20 69 73 20 73 69   The array is si
203b0 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e  zed at.    ** on
203c0 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  e entry for each
203d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
203e0 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
203f0 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a  hain. The.    **
20400 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
20410 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
20420 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f 72 65  ow page is store
20430 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30  d in aOverflow[0
20440 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41  ],.    ** etc. A
20450 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74   value of 0 in t
20460 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
20470 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20  rray means "not 
20480 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a  yet known".    *
20490 2a 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20  * (the cache is 
204a0 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64  lazily populated
204b0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
204c0 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c  ( pCur->isIncrbl
204d0 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75  obHandle && !pCu
204e0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
204f0 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
20500 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
20510 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
20520 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
20530 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
20540 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
20550 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73  flow = (Pgno *)s
20560 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
20570 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f  (sizeof(Pgno)*nO
20580 76 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a 20 6e  vfl);.      /* n
20590 4f 76 66 6c 20 69 73 20 61 6c 77 61 79 73 20 70  Ovfl is always p
205a0 6f 73 69 74 69 76 65 2e 20 20 49 66 20 69 74 20  ositive.  If it 
205b0 77 65 72 65 20 7a 65 72 6f 2c 20 66 65 74 63 68  were zero, fetch
205c0 50 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20 68 61  Payload would ha
205d0 76 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 65 6e  ve.      ** been
205e0 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
205f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 2a   this routine. *
20600 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  /.      if( ALWA
20610 59 53 28 6e 4f 76 66 6c 29 20 26 26 20 21 70 43  YS(nOvfl) && !pC
20620 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
20630 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
20640 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
20650 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
20660 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  * If the overflo
20670 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
20680 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
20690 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20  ated and the.   
206a0 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68   ** entry for th
206b0 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64  e first required
206c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
206d0 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20  s valid, skip.  
206e0 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
206f0 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
20700 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
20710 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
20720 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76  erflow[offset/ov
20730 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20  flSize] ){.     
20740 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
20750 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
20760 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
20770 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
20780 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  ];.      offset 
20790 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
207a0 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ze);.    }.#endi
207b0 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63  f..    for( ; rc
207c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
207d0 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65  mt>0 && nextPage
207e0 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e  ; iIdx++){..#ifn
207f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20800 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f  INCRBLOB.      /
20810 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70  * If required, p
20820 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
20830 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
20840 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ache. */.      i
20850 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
20860 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ow ){.        as
20870 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65  sert(!pCur->aOve
20880 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70  rflow[iIdx] || p
20890 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
208a0 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b  Idx]==nextPage);
208b0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61  .        pCur->a
208c0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
208d0 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20   nextPage;.     
208e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
208f0 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
20900 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
20910 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
20920 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
20930 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
20940 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
20950 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
20960 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
20970 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
20980 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
20990 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
209a0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
209b0 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
209c0 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
209d0 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
209e0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
209f0 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
20a00 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
20a10 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
20a20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
20a30 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
20a40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20a50 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
20a60 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
20a70 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
20a80 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
20a90 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
20aa0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
20ab0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
20ac0 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20  x+1];.        } 
20ad0 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20  else .#endif.   
20ae0 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
20af0 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
20b00 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
20b10 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
20b20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c    offset -= ovfl
20b30 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Size;.      }els
20b40 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  e{.        /* Ne
20b50 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  ed to read this 
20b60 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49  page properly. I
20b70 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  t contains some 
20b80 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
20b90 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20  * range of data 
20ba0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65  that is being re
20bb0 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77  ad (eOp==0) or w
20bc0 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e  ritten (eOp!=0).
20bd0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64  .        */.#ifd
20be0 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
20bf0 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
20c00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
20c10 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a  ile *fd;.#endif.
20c20 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
20c30 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  amt;.        if(
20c40 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
20c50 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
20c60 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
20c70 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
20c80 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
20c90 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
20ca0 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
20cb0 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66   /* If all the f
20cc0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
20cd0 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e:.        **.  
20ce0 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68        **   1) th
20cf0 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
20d00 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20  ration, and .   
20d10 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74       **   2) dat
20d20 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72  a is required fr
20d30 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
20d40 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61  this overflow pa
20d50 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ge, and.        
20d60 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61 74 61  **   3) the data
20d70 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61 63  base is file-bac
20d80 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  ked, and.       
20d90 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20 69   **   4) there i
20da0 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65 2d  s no open write-
20db0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
20dc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35 29  .        **   5)
20dd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
20de0 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61 62   not a WAL datab
20df0 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ase,.        **.
20e00 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
20e10 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64  data can be read
20e20 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
20e30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20e40 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
20e50 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66    ** output buff
20e60 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68  er, bypassing th
20e70 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74  e page-cache alt
20e80 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70  ogether. This sp
20e90 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  eeds.        ** 
20ea0 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65  up loading large
20eb0 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70   records that sp
20ec0 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77  an many overflow
20ed0 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20   pages..        
20ee0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  */.        if( e
20ef0 4f 70 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  Op==0           
20f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
20f30 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d       && offset==
20f40 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
20f70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
20f80 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
20f90 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ion==TRANS_READ 
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fb0 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20 20      /* (4) */.  
20fc0 20 20 20 20 20 20 20 26 26 20 28 66 64 20 3d 20         && (fd = 
20fd0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
20fe0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e  (pBt->pPager))->
20ff0 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20  pMethods     /* 
21000 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (3) */.         
21010 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  && pBt->pPage1->
21020 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31 20  aData[19]==0x01 
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21040 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a        /* (5) */.
21050 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
21060 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d       u8 aSave[4]
21070 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a  ;.          u8 *
21080 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d  aWrite = &pBuf[-
21090 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  4];.          me
210a0 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69  mcpy(aSave, aWri
210b0 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  te, 4);.        
210c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
210d0 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c  Read(fd, aWrite,
210e0 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e   a+4, (i64)pBt->
210f0 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61  pageSize*(nextPa
21100 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20  ge-1));.        
21110 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
21120 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20  4byte(aWrite);. 
21130 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
21140 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34  aWrite, aSave, 4
21150 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
21160 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20  .#endif..       
21170 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50   {.          DbP
21180 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
21190 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
211a0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
211b0 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
211c0 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ge, &pDbPage);. 
211d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
211e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
211f0 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f            aPaylo
21200 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ad = sqlite3Page
21210 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
21220 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
21230 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
21240 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
21250 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
21260 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
21270 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
21280 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44  pBuf, a, eOp, pD
21290 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
212a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
212b0 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
212c0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73              offs
212d0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
212e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
212f0 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
21300 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
21310 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  a;.      }.    }
21320 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
21330 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
21340 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
21350 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
21360 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
21370 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21380 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
21390 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
213a0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
213b0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
213c0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
213d0 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
213e0 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
213f0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
21400 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
21410 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
21420 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
21430 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e   pCur is pointin
21440 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  g to a valid row
21450 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65  .** in the table
21460 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
21470 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
21480 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
21490 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
214a0 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
214b0 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
214c0 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
214d0 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
214e0 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
214f0 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
21500 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
21510 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  eeKey(BtCursor *
21520 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
21530 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
21540 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74  *pBuf){.  assert
21550 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21560 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
21570 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
21580 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
21590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
215a0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
215b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
215c0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
215d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
215e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
215f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21600 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
21610 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63   );.  return acc
21620 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
21630 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
21640 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
21650 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf, 0);.}../*.**
21660 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
21670 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  e data associate
21680 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
21690 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
216a0 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
216b0 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
216c0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
216d0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
216e0 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
216f0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
21700 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
21710 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
21720 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
21730 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
21740 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
21750 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
21760 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
21770 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
21780 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
21790 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
217a0 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  eData(BtCursor *
217b0 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
217c0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
217d0 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
217e0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
217f0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
21800 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74    if ( pCur->eSt
21810 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
21820 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
21830 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
21840 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
21850 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
21860 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
21870 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
21880 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
21890 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
218a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
218b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
218c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
218d0 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
218e0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
218f0 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
21900 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
21910 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
21920 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
21930 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
21940 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
21950 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
21960 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
21970 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
21980 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d  t, pBuf, 0);.  }
21990 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
219a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
219b0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
219c0 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
219d0 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
219e0 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
219f0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
21a00 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
21a10 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
21a20 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
21a30 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79  e key if skipKey
21a40 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74  ==0 and it point
21a50 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
21a60 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a  ng of data if.**
21a70 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68   skipKey==1.  Th
21a80 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
21a90 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b  s of available k
21aa0 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74  ey/data is writt
21ab0 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74  en.** into *pAmt
21ac0 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20  .  If *pAmt==0, 
21ad0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72  then the value r
21ae0 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74  eturned will not
21af0 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70   be.** a valid p
21b00 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ointer..**.** Th
21b10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
21b20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
21b30 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72  It is common for
21b40 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a   the entire key.
21b50 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66  ** and data to f
21b60 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  it on the local 
21b70 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65  page and for the
21b80 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72  re to be no over
21b90 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20  flow.** pages.  
21ba0 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c  When that is so,
21bb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
21bc0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63  n be used to acc
21bd0 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61  ess the.** key a
21be0 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20  nd data without 
21bf0 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20  making a copy.  
21c00 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f  If the key and/o
21c10 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a  r data spills.**
21c20 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
21c30 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73  ages, then acces
21c40 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20  sPayload() must 
21c50 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73  be used to reass
21c60 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79  emble.** the key
21c70 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69  /data and copy i
21c80 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f  t into a preallo
21c90 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a  cated buffer..**
21ca0 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
21cb0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
21cc0 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64   routine looks d
21cd0 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65  irectly into the
21ce0 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20   cached.** page 
21cf0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
21d00 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74    The data might
21d10 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20   change or move 
21d20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a  the next time.**
21d30 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69   any btree routi
21d40 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
21d50 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
21d60 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74  signed char *fet
21d70 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
21d80 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
21d90 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
21da0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
21db0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
21dc0 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20  int *pAmt,      
21dd0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
21de0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
21df0 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
21e00 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65   */.  int skipKe
21e10 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65  y          /* re
21e20 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  ad beginning at 
21e30 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20  data if this is 
21e40 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  true */.){.  uns
21e50 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
21e60 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20  load;.  MemPage 
21e70 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b  *pPage;.  u32 nK
21e80 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c  ey;.  u32 nLocal
21e90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
21ea0 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50  r!=0 && pCur->iP
21eb0 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
21ec0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21ed0 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge]);.  assert( 
21ee0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21ef0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
21f00 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
21f10 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
21f20 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
21f30 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21f40 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
21f50 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
21f60 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
21f70 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
21f80 4e 45 56 45 52 28 70 43 75 72 2d 3e 69 6e 66 6f  NEVER(pCur->info
21f90 2e 6e 53 69 7a 65 3d 3d 30 29 20 29 7b 0a 20 20  .nSize==0) ){.  
21fa0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
21fb0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
21fc0 75 72 2d 3e 69 50 61 67 65 5d 2c 20 70 43 75 72  ur->iPage], pCur
21fd0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
21fe0 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  age],.          
21ff0 20 20 20 20 20 20 20 20 20 26 70 43 75 72 2d 3e           &pCur->
22000 69 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 61 50 61  info);.  }.  aPa
22010 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
22020 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79  fo.pCell;.  aPay
22030 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e  load += pCur->in
22040 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66  fo.nHeader;.  if
22050 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
22060 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b  ){.    nKey = 0;
22070 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b  .  }else{.    nK
22080 65 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e  ey = (int)pCur->
22090 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20  info.nKey;.  }. 
220a0 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a   if( skipKey ){.
220b0 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20      aPayload += 
220c0 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c  nKey;.    nLocal
220d0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
220e0 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d  ocal - nKey;.  }
220f0 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c  else{.    nLocal
22100 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
22110 6f 63 61 6c 3b 0a 20 20 20 20 61 73 73 65 72 74  ocal;.    assert
22120 28 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29  ( nLocal<=nKey )
22130 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20  ;.  }.  *pAmt = 
22140 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e  nLocal;.  return
22150 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f   aPayload;.}.../
22160 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
22170 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
22180 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
22190 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
221a0 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
221b0 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
221c0 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
221d0 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
221e0 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
221f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
22200 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
22210 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
22220 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
22230 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
22240 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
22250 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
22260 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
22270 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
22280 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
22290 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
222a0 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
222b0 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
222c0 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
222d0 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
222e0 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
222f0 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
22300 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
22310 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
22320 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
22330 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
22340 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
22350 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
22360 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
22370 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
22380 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
22390 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
223a0 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
223b0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74  lite3BtreeKeyFet
223c0 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
223d0 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
223e0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d   const void *p =
223f0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   0;.  assert( sq
22400 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
22410 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
22420 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
22430 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
22440 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
22450 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43  .  if( ALWAYS(pC
22460 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22470 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20  OR_VALID) ){.   
22480 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64   p = (const void
22490 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
224a0 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20  Cur, pAmt, 0);. 
224b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
224c0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
224d0 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
224e0 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
224f0 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
22500 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d   const void *p =
22510 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   0;.  assert( sq
22520 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
22530 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
22540 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
22550 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
22560 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
22570 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43  .  if( ALWAYS(pC
22580 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22590 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20  OR_VALID) ){.   
225a0 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64   p = (const void
225b0 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
225c0 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20  Cur, pAmt, 1);. 
225d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
225e0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
225f0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
22600 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
22610 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20  e.  The newPgno 
22620 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a  argument is the.
22630 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
22640 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
22650 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a   to move to..**.
22660 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
22670 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
22680 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70  CORRUPT if the p
22690 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73  age-header flags
226a0 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65   field of.** the
226b0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
226c0 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
226d0 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  he flags field o
226e0 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e  f the parent (i.
226f0 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b  e..** if an intk
22700 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20  ey page appears 
22710 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74  to be the parent
22720 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79   of a non-intkey
22730 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63   page, or.** vic
22740 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61  e-versa)..*/.sta
22750 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68  tic int moveToCh
22760 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ild(BtCursor *pC
22770 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29  ur, u32 newPgno)
22780 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
22790 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  t i = pCur->iPag
227a0 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  e;.  MemPage *pN
227b0 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72  ewPage;.  BtShar
227c0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
227d0 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
227e0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
227f0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
22800 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
22810 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
22820 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
22830 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52  ->iPage<BTCURSOR
22840 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20  _MAX_DEPTH );.  
22850 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
22860 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  =(BTCURSOR_MAX_D
22870 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72  EPTH-1) ){.    r
22880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
22890 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
228a0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
228b0 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
228c0 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20  o, &pNewPage);. 
228d0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
228e0 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50   rc;.  pCur->apP
228f0 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50  age[i+1] = pNewP
22900 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49  age;.  pCur->aiI
22910 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70  dx[i+1] = 0;.  p
22920 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20  Cur->iPage++;.. 
22930 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
22940 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
22950 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
22960 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43  if( pNewPage->nC
22970 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67  ell<1 || pNewPag
22980 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d  e->intKey!=pCur-
22990 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b  >apPage[i]->intK
229a0 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ey ){.    return
229b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
229c0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
229d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
229e0 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 50 61 67  .#if 0./*.** Pag
229f0 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20  e pParent is an 
22a00 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65  internal (non-le
22a10 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54  af) tree page. T
22a20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
22a30 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61   asserts that pa
22a40 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
22a50 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69   is the left-chi
22a60 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74  ld if the iIdx't
22a70 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67  h.** cell in pag
22a80 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69  e pParent. Or, i
22a90 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20  f iIdx is equal 
22aa0 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
22ab0 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20  ber of.** cells 
22ac0 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74  in pParent, that
22ad0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
22ae0 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74  ild is the right
22af0 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65  -child of.** the
22b00 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
22b10 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65   void assertPare
22b20 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20  ntIndex(MemPage 
22b30 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49  *pParent, int iI
22b40 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29  dx, Pgno iChild)
22b50 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  {.  assert( iIdx
22b60 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  <=pParent->nCell
22b70 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d   );.  if( iIdx==
22b80 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
22b90 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
22ba0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
22bb0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
22bc0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69  hdrOffset+8])==i
22bd0 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65  Child );.  }else
22be0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
22bf0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
22c00 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d  pParent, iIdx))=
22c10 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d  =iChild );.  }.}
22c20 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
22c30 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
22c40 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  ex(x,y,z) .#endi
22c50 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
22c60 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
22c70 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
22c80 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
22c90 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
22ca0 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
22cb0 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
22cc0 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
22cd0 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
22ce0 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
22cf0 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
22d00 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
22d10 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
22d20 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
22d30 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
22d40 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
22d50 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  cell index..*/.s
22d60 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54  tatic void moveT
22d70 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72  oParent(BtCursor
22d80 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
22d90 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
22da0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
22db0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
22dc0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
22dd0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
22de0 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
22df0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22e00 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22e10 67 65 5d 20 29 3b 0a 0a 20 20 2f 2a 20 55 50 44  ge] );..  /* UPD
22e20 41 54 45 3a 20 49 74 20 69 73 20 61 63 74 75 61  ATE: It is actua
22e30 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  lly possible for
22e40 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 74   the condition t
22e50 65 73 74 65 64 20 62 79 20 74 68 65 20 61 73 73  ested by the ass
22e60 65 72 74 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 74  ert.  ** below t
22e70 6f 20 62 65 20 75 6e 74 72 75 65 20 69 66 20 74  o be untrue if t
22e80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22e90 20 69 73 20 63 6f 72 72 75 70 74 2e 20 54 68 69   is corrupt. Thi
22ea0 73 20 63 61 6e 20 6f 63 63 75 72 20 69 66 0a 20  s can occur if. 
22eb0 20 2a 2a 20 6f 6e 65 20 63 75 72 73 6f 72 20 68   ** one cursor h
22ec0 61 73 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65  as modified page
22ed0 20 70 50 61 72 65 6e 74 20 77 68 69 6c 65 20 61   pParent while a
22ee0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
22ef0 20 69 73 20 68 65 6c 64 20 0a 20 20 2a 2a 20 62   is held .  ** b
22f00 79 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f  y a second curso
22f10 72 2e 20 57 68 69 63 68 20 63 61 6e 20 6f 6e 6c  r. Which can onl
22f20 79 20 68 61 70 70 65 6e 20 69 66 20 61 20 73 69  y happen if a si
22f30 6e 67 6c 65 20 70 61 67 65 20 69 73 20 6c 69 6e  ngle page is lin
22f40 6b 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 6d 6f  ked.  ** into mo
22f50 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72  re than one b-tr
22f60 65 65 20 73 74 72 75 63 74 75 72 65 20 69 6e 20  ee structure in 
22f70 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
22f80 73 65 2e 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20  se.  */.#if 0.  
22f90 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
22fa0 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
22fb0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
22fc0 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
22fd0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22fe0 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
22ff0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23000 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 23  ge]->pgno.  );.#
23010 65 6e 64 69 66 0a 20 20 74 65 73 74 63 61 73 65  endif.  testcase
23020 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
23030 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70  ur->iPage-1] > p
23040 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23050 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c  ->iPage-1]->nCel
23060 6c 20 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50  l );..  releaseP
23070 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
23080 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
23090 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
230a0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
230b0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
230c0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
230d0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
230e0 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
230f0 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
23100 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65  ge of its b-tree
23110 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
23120 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  * If the table h
23130 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  as a virtual roo
23140 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
23150 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
23160 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20   to point.** to 
23170 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
23180 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66   page instead of
23190 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
231a0 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68   page. A table h
231b0 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20  as a.** virtual 
231c0 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74  root page when t
231d0 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
231e0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
231f0 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20  cells and a .** 
23200 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67  single child pag
23210 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
23220 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65   happen with the
23230 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
23240 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49   page 1..**.** I
23250 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72  f the b-tree str
23260 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c  ucture is empty,
23270 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
23280 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20  e is set to .** 
23290 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20  CURSOR_INVALID. 
232a0 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63  Otherwise, the c
232b0 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20  ursor is set to 
232c0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
232d0 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74  st.** cell locat
232e0 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28  ed on the root (
232f0 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29  or virtual root)
23300 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75   page and the cu
23310 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73  rsor state.** is
23320 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56   set to CURSOR_V
23330 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ALID..**.** If t
23340 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
23350 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c  urns successfull
23360 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73  y, it may be ass
23370 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a  umed that the.**
23380 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
23390 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  gs indicate that
233a0 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72   the [virtual] r
233b0 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20  oot-page is the 
233c0 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e  expected .** kin
233d0 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  d of b-tree page
233e0 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f   (i.e. if when o
233f0 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  pening the curso
23400 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  r the caller did
23410 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20   not.** specify 
23420 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
23430 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
23440 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
23450 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e  5 or 0x0D,.** in
23460 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65  dicating a table
23470 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74   b-tree, or if t
23480 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70  he caller did sp
23490 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
234a0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68  .** structure th
234b0 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
234c0 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30  set to 0x02 or 0
234d0 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  x0A, indicating 
234e0 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72  an index.** b-tr
234f0 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ee)..*/.static i
23500 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
23510 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
23520 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
23530 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23540 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a  TE_OK;.  Btree *
23550 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
23560 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
23570 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
23580 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
23590 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
235a0 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
235b0 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
235c0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
235d0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
235e0 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
235f0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
23600 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
23610 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
23620 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
23630 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
23640 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
23650 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
23660 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
23670 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
23680 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
23690 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
236a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
236b0 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72       return pCur
236c0 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  ->skipNext;.    
236d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
236e0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
236f0 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ur);.  }..  if( 
23700 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
23710 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
23720 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75   for(i=1; i<=pCu
23730 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
23740 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
23750 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
23760 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ]);.    }.    pC
23770 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
23780 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d   }else if( pCur-
23790 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a  >pgnoRoot==0 ){.
237a0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
237b0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
237c0 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
237d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
237e0 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  {.    rc = getAn
237f0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
23800 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
23810 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29  pCur->apPage[0])
23820 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
23830 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23840 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
23850 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
23860 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
23870 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
23880 3e 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20  >iPage = 0;..   
23890 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
238a0 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
238b0 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
238c0 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
238d0 68 69 73 20 63 75 72 73 6f 72 0a 20 20 20 20 2a  his cursor.    *
238e0 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70  * expected to op
238f0 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65  en it on an inde
23900 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77  x b-tree. Otherw
23910 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f  ise, if pKeyInfo
23920 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c   is.    ** NULL,
23930 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65   the caller expe
23940 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72  cts a table b-tr
23950 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  ee. If this is n
23960 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 20  ot the case,.   
23970 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51   ** return an SQ
23980 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
23990 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  or.  */.    asse
239a0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
239b0 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c  [0]->intKey==1 |
239c0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  | pCur->apPage[0
239d0 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a  ]->intKey==0 );.
239e0 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 70      if( (pCur->p
239f0 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75  KeyInfo==0)!=pCu
23a00 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
23a10 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
23a20 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
23a30 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
23a40 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74    }..  /* Assert
23a50 20 74 68 61 74 20 74 68 65 20 72 6f 6f 74 20 70   that the root p
23a60 61 67 65 20 69 73 20 6f 66 20 74 68 65 20 63 6f  age is of the co
23a70 72 72 65 63 74 20 74 79 70 65 2e 20 54 68 69 73  rrect type. This
23a80 20 6d 75 73 74 20 62 65 20 74 68 65 0a 20 20 2a   must be the.  *
23a90 2a 20 63 61 73 65 20 61 73 20 74 68 65 20 63 61  * case as the ca
23aa0 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ll to this funct
23ab0 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65 64 20  ion that loaded 
23ac0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 28 65  the root-page (e
23ad0 69 74 68 65 72 0a 20 20 2a 2a 20 74 68 69 73 20  ither.  ** this 
23ae0 63 61 6c 6c 20 6f 72 20 61 20 70 72 65 76 69 6f  call or a previo
23af0 75 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29 20 77  us invocation) w
23b00 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74  ould have detect
23b10 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 20 0a 20  ed corruption . 
23b20 20 2a 2a 20 69 66 20 74 68 65 20 61 73 73 75 6d   ** if the assum
23b30 70 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74  ption were not t
23b40 72 75 65 2c 20 61 6e 64 20 69 74 20 69 73 20 6e  rue, and it is n
23b50 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
23b60 74 68 65 20 66 6c 61 67 73 20 0a 20 20 2a 2a 20  the flags .  ** 
23b70 62 79 74 65 20 74 6f 20 68 61 76 65 20 62 65 65  byte to have bee
23b80 6e 20 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65  n modified while
23b90 20 74 68 69 73 20 63 75 72 73 6f 72 20 69 73 20   this cursor is 
23ba0 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
23bb0 6e 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  nce.  ** to the 
23bc0 70 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f  page.  */.  pRoo
23bd0 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
23be0 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
23bf0 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
23c00 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20  ->pgnoRoot );.  
23c10 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69  assert( pRoot->i
23c20 73 49 6e 69 74 20 26 26 20 28 70 43 75 72 2d 3e  sInit && (pCur->
23c30 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52  pKeyInfo==0)==pR
23c40 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a  oot->intKey );..
23c50 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
23c60 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
23c70 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
23c80 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30  pCur->atLast = 0
23c90 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
23ca0 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Key = 0;..  if( 
23cb0 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pRoot->nCell==0 
23cc0 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  && !pRoot->leaf 
23cd0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
23ce0 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
23cf0 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
23d00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
23d10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75  UPT_BKPT;.    su
23d20 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
23d30 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
23d40 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
23d50 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  8]);.    pCur->e
23d60 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
23d70 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
23d80 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
23d90 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
23da0 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
23db0 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e  tate = ((pRoot->
23dc0 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f  nCell>0)?CURSOR_
23dd0 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56  VALID:CURSOR_INV
23de0 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ALID);.  }.  ret
23df0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23e00 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
23e10 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
23e20 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
23e30 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
23e40 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
23e50 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
23e60 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
23e70 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
23e80 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
23e90 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
23ea0 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
23eb0 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
23ec0 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
23ed0 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
23ee0 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
23ef0 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
23f00 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
23f10 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
23f20 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
23f30 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
23f40 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
23f50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
23f60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
23f70 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
23f80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
23f90 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
23fa0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23fb0 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
23fc0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
23fd0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23fe0 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
23ff0 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
24000 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
24010 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69  (pPage, pCur->ai
24020 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
24030 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
24040 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
24050 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
24060 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24070 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
24080 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
24090 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
240a0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
240b0 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
240c0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
240d0 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
240e0 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
240f0 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
24100 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
24110 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
24120 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
24130 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
24140 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
24150 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
24160 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
24170 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
24180 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
24190 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
241a0 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
241b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
241c0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
241d0 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
241e0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
241f0 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
24200 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
24210 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
24220 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
24230 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
24240 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
24250 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24260 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
24270 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
24280 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
24290 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
242a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
242b0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
242c0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
242d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
242e0 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
242f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24300 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
24310 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
24320 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
24330 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
24340 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
24350 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
24360 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
24370 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ell;.    rc = mo
24380 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
24390 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pgno);.  }.  if(
243a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
243b0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  {.    pCur->aiId
243c0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
243d0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
243e0 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
243f0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
24400 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
24410 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
24420 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
24430 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
24440 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
24450 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
24460 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
24470 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
24480 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
24490 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
244a0 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
244b0 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
244c0 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
244d0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
244e0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
244f0 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
24500 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
24510 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
24520 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
24530 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
24540 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
24550 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
24560 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
24570 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
24580 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
24590 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
245a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
245b0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
245c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
245d0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61  VALID ){.      a
245e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
245f0 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
24600 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24610 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
24620 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
24630 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
24640 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
24650 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24660 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
24670 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
24680 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
24690 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
246a0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ur);.    }.  }. 
246b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
246c0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
246d0 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
246e0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
246f0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
24700 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
24710 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
24720 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
24730 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
24740 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
24750 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
24760 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
24770 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
24780 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
24790 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
247a0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
247b0 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65  int rc;. .  asse
247c0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
247d0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
247e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
247f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
24800 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
24810 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
24820 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61  the cursor alrea
24830 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
24840 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69   last entry, thi
24850 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  s is a no-op. */
24860 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41  .  if( CURSOR_VA
24870 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
24880 65 20 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73  e && pCur->atLas
24890 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  t ){.#ifdef SQLI
248a0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
248b0 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
248c0 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  s to assert() th
248d0 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65  at the cursor re
248e0 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20  ally does point 
248f0 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c  .    ** to the l
24900 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
24910 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20   b-tree. */.    
24920 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
24930 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69  ii=0; ii<pCur->i
24940 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
24950 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
24960 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72  >aiIdx[ii]==pCur
24970 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43  ->apPage[ii]->nC
24980 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ell );.    }.   
24990 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
249a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
249b0 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
249c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
249d0 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73  ell-1 );.    ass
249e0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
249f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
24a00 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  leaf );.#endif. 
24a10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24a20 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
24a30 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
24a40 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
24a50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
24a60 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
24a70 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
24a80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
24a90 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
24aa0 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
24ab0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
24ac0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
24ad0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
24ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
24af0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
24b00 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
24b10 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
24b20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
24b30 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
24b40 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75  pCur);.      pCu
24b50 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d  r->atLast = rc==
24b60 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a  SQLITE_OK ?1:0;.
24b70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24b80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
24b90 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
24ba0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
24bb0 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
24bc0 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
24bd0 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
24be0 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
24bf0 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
24c00 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
24c10 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
24c20 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
24c30 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
24c40 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
24c50 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
24c60 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
24c70 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
24c80 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
24c90 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
24ca0 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
24cb0 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
24cc0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
24cd0 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
24ce0 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
24cf0 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
24d00 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
24d10 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
24d20 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
24d30 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
24d40 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
24d50 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
24d60 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
24d70 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
24d80 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
24d90 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
24da0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
24db0 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
24dc0 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
24dd0 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
24de0 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
24df0 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
24e00 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
24e10 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
24e20 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
24e30 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
24e40 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
24e50 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
24e60 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
24e70 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e90 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
24ea0 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
24eb0 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
24ec0 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
24ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
24ee0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
24ef0 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
24f00 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
24f10 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
24f20 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
24f30 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
24f40 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
24f50 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
24f60 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
24f70 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
24f80 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
24f90 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
24fa0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
24fb0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
24fc0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fe0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
24ff0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
25000 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
25010 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
25020 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
25030 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
25040 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
25050 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55   be moved */.  U
25060 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
25070 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63  IdxKey, /* Unpac
25080 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
25090 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20  .  i64 intKey,  
250a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
250b0 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a  he table key */.
250c0 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
250d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
250e0 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
250f0 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
25100 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
25110 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
25120 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
25130 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
25140 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
25150 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
25160 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
25170 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
25180 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
25190 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
251a0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
251b0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29    assert( pRes )
251c0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64  ;.  assert( (pId
251d0 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
251e0 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b  >pKeyInfo==0) );
251f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
25200 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
25210 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
25220 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
25230 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
25240 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
25250 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
25260 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
25270 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  /.  if( pCur->eS
25280 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
25290 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69  ID && pCur->vali
252a0 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75  dNKey .   && pCu
252b0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
252c0 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69  tKey .  ){.    i
252d0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
252e0 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
252f0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
25300 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25310 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
25320 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73   if( pCur->atLas
25330 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t && pCur->info.
25340 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  nKey<intKey ){. 
25350 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b       *pRes = -1;
25360 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
25370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
25380 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
25390 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
253a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
253b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
253c0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
253d0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
253e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
253f0 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
25400 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
25410 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
25420 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25430 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
25440 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
25450 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
25460 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  ID || pCur->apPa
25470 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
25480 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66  >nCell>0 );.  if
25490 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
254a0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
254b0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
254c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
254d0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
254e0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
254f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
25500 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
25510 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25520 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
25530 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
25540 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79  ntKey || pIdxKey
25550 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20   );.  for(;;){. 
25560 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c     int lwr, upr,
25570 20 69 64 78 3b 0a 20 20 20 20 50 67 6e 6f 20 63   idx;.    Pgno c
25580 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
25590 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
255a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
255b0 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63  Page];.    int c
255c0 3b 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d  ;..    /* pPage-
255d0 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67  >nCell must be g
255e0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
255f0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
25600 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
25610 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75  * the cursor wou
25620 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56  ld have been INV
25630 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74  ALID above and t
25640 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70  his for(;;) loop
25650 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e  .    ** not run.
25660 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
25670 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74  the root-page, t
25680 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68  hen the moveToCh
25690 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  ild() routine.  
256a0 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20    ** would have 
256b0 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64  already detected
256c0 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20   db corruption. 
256d0 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65  Similarly, pPage
256e0 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
256f0 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28  the right kind (
25700 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20  index or table) 
25710 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  of b-tree page. 
25720 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
25730 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
25740 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29   or moveToRoot()
25750 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65   call would have
25760 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
25770 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73  tion.  */.    as
25780 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
25790 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ll>0 );.    asse
257a0 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
257b0 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20  y==(pIdxKey==0) 
257c0 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  );.    lwr = 0;.
257d0 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
257e0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66  >nCell-1;.    if
257f0 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20  ( biasRight ){. 
25800 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
25810 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
25820 28 75 31 36 29 28 69 64 78 20 3d 20 75 70 72 29  (u16)(idx = upr)
25830 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25840 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
25850 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
25860 31 36 29 28 69 64 78 20 3d 20 28 75 70 72 2b 6c  16)(idx = (upr+l
25870 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20  wr)/2);.    }.  
25880 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
25890 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20   u8 *pCell;     
258a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258b0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
258c0 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20  to current cell 
258d0 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20  in pPage */..   
258e0 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3d 3d     assert( idx==
258f0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
25900 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
25910 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
25920 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43  ze = 0;.      pC
25930 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
25940 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61  Page, idx) + pPa
25950 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
25960 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
25970 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
25980 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65       i64 nCellKe
25990 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  y;.        if( p
259a0 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
259b0 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 64  .          u32 d
259c0 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20  ummy;.          
259d0 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69  pCell += getVari
259e0 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d  nt32(pCell, dumm
259f0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
25a00 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
25a10 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43  pCell, (u64*)&nC
25a20 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
25a30 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69   if( nCellKey==i
25a40 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
25a50 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
25a60 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
25a70 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
25a80 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b           c = -1;
25a90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
25aa0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
25ab0 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
25ac0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  y );.          c
25ad0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
25ae0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 76  .        pCur->v
25af0 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20  alidNKey = 1;.  
25b00 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
25b10 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
25b20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25b30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
25b40 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
25b50 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35  page-size is 655
25b60 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  36 bytes. This m
25b70 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20  eans that.      
25b80 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
25b90 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   number of recor
25ba0 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f  d bytes stored o
25bb0 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  n an index B-Tre
25bc0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
25bd0 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  e is less than 1
25be0 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d  6384 bytes and m
25bf0 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
25c00 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20  a 2-byte.       
25c10 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73   ** varint. This
25c20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
25c30 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  used to attempt 
25c40 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67  to avoid parsing
25c50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
25c60 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20   entire cell by 
25c70 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65  checking for the
25c80 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
25c90 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20   record is .    
25ca0 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e      ** stored en
25cb0 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68  tirely within th
25cc0 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79  e b-tree page by
25cd0 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20   inspecting the 
25ce0 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a  first .        *
25cf0 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 2 bytes of the
25d00 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a   cell..        *
25d10 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  /.        int nC
25d20 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a  ell = pCell[0];.
25d30 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
25d40 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79  l<=pPage->max1by
25d50 74 65 50 61 79 6c 6f 61 64 0a 20 20 20 20 20 20  tePayload.      
25d60 20 20 20 2f 2a 20 26 26 20 28 70 43 65 6c 6c 2b     /* && (pCell+
25d70 6e 43 65 6c 6c 29 3c 70 50 61 67 65 2d 3e 61 44  nCell)<pPage->aD
25d80 61 74 61 45 6e 64 20 2a 2f 0a 20 20 20 20 20 20  ataEnd */.      
25d90 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
25da0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
25db0 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ns if the record
25dc0 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
25dd0 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20  he cell is a.   
25de0 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
25df0 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
25e00 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73   the record fits
25e10 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
25e20 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20   main.          
25e30 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
25e40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
25e50 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
25e60 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+1==pPage->aD
25e70 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
25e80 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
25e90 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
25ea0 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26  (nCell, (void*)&
25eb0 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65  pCell[1], pIdxKe
25ec0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  y);.        }els
25ed0 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d  e if( !(pCell[1]
25ee0 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20   & 0x80) .      
25ef0 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20      && (nCell = 
25f00 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37  ((nCell&0x7f)<<7
25f10 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70  ) + pCell[1])<=p
25f20 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20  Page->maxLocal. 
25f30 20 20 20 20 20 20 20 20 20 2f 2a 20 26 26 20 28           /* && (
25f40 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 29 3c 3d  pCell+nCell+2)<=
25f50 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
25f60 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
25f70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
25f80 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
25f90 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72   is a 2 byte var
25fa0 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
25fb0 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rd .          **
25fc0 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
25fd0 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65  n the main b-tre
25fe0 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
25ff0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26000 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70  pCell+nCell+2==p
26010 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
26020 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
26030 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
26040 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
26050 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d  (void*)&pCell[2]
26060 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
26070 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26080 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
26090 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e  rd flows over on
260a0 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  to one or more o
260b0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
260c0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  n.          ** t
260d0 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f  his case the who
260e0 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f  le cell needs to
260f0 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75   be parsed, a bu
26100 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20  ffer allocated. 
26110 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
26120 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
26130 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65  used to retrieve
26140 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f   the record into
26150 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
26160 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20  * buffer before 
26170 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
26180 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  e() can be calle
26190 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d. */.          
261a0 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
261b0 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63            u8 * c
261c0 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d  onst pCellBody =
261d0 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e   pCell - pPage->
261e0 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
261f0 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61 72          btreePar
26200 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
26210 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75   pCellBody, &pCu
26220 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
26230 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74      nCell = (int
26240 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
26250 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  ;.          pCel
26260 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  lKey = sqlite3Ma
26270 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20  lloc( nCell );. 
26280 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
26290 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20  llKey==0 ){.    
262a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
262b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
262c0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
262d0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
262e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
262f0 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
26300 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  oad(pCur, 0, nCe
26310 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ll, (unsigned ch
26320 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29  ar*)pCellKey, 0)
26330 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26340 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
26350 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
26360 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
26370 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
26380 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
26390 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
263a0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
263b0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
263c0 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ll, pCellKey, pI
263d0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
263e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
263f0 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
26400 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
26410 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
26420 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
26430 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
26440 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
26450 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a       lwr = idx;.
26460 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
26470 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26480 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20            *pRes 
26490 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
264a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
264b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
264c0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
264d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
264e0 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a       if( c<0 ){.
264f0 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
26500 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  x+1;.      }else
26510 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20  {.        upr = 
26520 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  idx-1;.      }. 
26530 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
26540 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
26550 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
26560 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
26570 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
26580 29 28 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  )(idx = (lwr+upr
26590 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  )/2);.    }.    
265a0 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
265b0 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e  +1 || (pPage->in
265c0 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
265d0 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73  leaf) );.    ass
265e0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
265f0 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
26600 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
26610 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20     chldPg = 0;. 
26620 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72     }else if( lwr
26630 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
26640 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
26650 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
26660 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
26670 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
26680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
26690 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
266a0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
266b0 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
266c0 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20    if( chldPg==0 
266d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
266e0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
266f0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
26700 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26710 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
26720 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20      *pRes = c;. 
26730 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26740 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
26750 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
26760 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61     }.    pCur->a
26770 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
26780 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20  ] = (u16)lwr;.  
26790 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
267a0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
267b0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
267c0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
267d0 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
267e0 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
267f0 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69  ) goto moveto_fi
26800 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f  nish;.  }.moveto
26810 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72  _finish:.  retur
26820 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
26830 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
26840 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
26850 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
26860 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
26870 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77  le..**.** TRUE w
26880 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
26890 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
268a0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
268b0 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74  () moves.** past
268c0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
268d0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  in the table or 
268e0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
268f0 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a  () moves past.**
26900 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
26910 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20  .  TRUE is also 
26920 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
26930 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
26940 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
26950 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20  reeEof(BtCursor 
26960 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44  *pCur){.  /* TOD
26970 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63  O: What if the c
26980 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53  ursor is in CURS
26990 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62  OR_REQUIRESEEK b
269a0 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74  ut all table ent
269b0 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62  ries.  ** have b
269c0 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69  een deleted? Thi
269d0 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20  s API will need 
269e0 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74  to change to ret
269f0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
26a00 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61  e.  ** as well a
26a10 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65  s the boolean re
26a20 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f  sult value..  */
26a30 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f  .  return (CURSO
26a40 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65  R_VALID!=pCur->e
26a50 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  State);.}../*.**
26a60 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72   Advance the cur
26a70 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
26a80 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
26a90 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
26aa0 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
26ab0 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
26ac0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
26ad0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
26ae0 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  g to the last en
26af0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
26b00 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
26b10 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
26b20 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
26b30 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20  *pRes=1..*/.int 
26b40 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
26b50 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
26b60 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
26b70 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
26b80 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
26b90 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
26ba0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
26bb0 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
26bc0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
26bd0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
26be0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26bf0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
26c00 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
26c10 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66   pRes!=0 );.  if
26c20 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
26c30 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
26c40 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
26c50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26c60 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
26c70 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e   pCur->skipNext>
26c80 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
26c90 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
26ca0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
26cb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26cc0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
26cd0 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70  ipNext = 0;..  p
26ce0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
26cf0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
26d00 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72  ;.  idx = ++pCur
26d10 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
26d20 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
26d30 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
26d40 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
26d50 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63  tabase file is c
26d60 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f  orrupt, it is po
26d70 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76  ssible for the v
26d80 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a  alue of idx .  *
26d90 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20  * to be invalid 
26da0 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  here. This can o
26db0 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73  nly occur if a s
26dc0 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64  econd cursor mod
26dd0 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70  ifies.  ** the p
26de0 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72  age while cursor
26df0 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67   pCur is holding
26e00 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
26e10 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20  it. Which can.  
26e20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  ** only happen i
26e30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
26e40 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63  s corrupt in suc
26e50 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69  h a way as to li
26e60 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  nk the.  ** page
26e70 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20   into more than 
26e80 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  one b-tree struc
26e90 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63  ture. */.  testc
26ea0 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e  ase( idx>pPage->
26eb0 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72  nCell );..  pCur
26ec0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
26ed0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
26ee0 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69  Key = 0;.  if( i
26ef0 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
26f00 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
26f10 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
26f20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
26f30 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
26f40 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
26f50 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
26f60 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
26f70 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
26f80 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
26f90 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
26fa0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
26fb0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
26fc0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  rc;.    }.    do
26fd0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
26fe0 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
26ff0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
27000 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
27010 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
27020 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
27030 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27040 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27050 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
27060 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
27070 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
27080 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
27090 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61   }while( pCur->a
270a0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
270b0 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ]>=pPage->nCell 
270c0 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  );.    *pRes = 0
270d0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
270e0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
270f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
27100 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
27110 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
27120 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27130 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  _OK;.    }.    r
27140 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
27150 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
27160 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
27170 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27180 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
27190 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
271a0 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
271b0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74  rc;.}.../*.** St
271c0 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ep the cursor to
271d0 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65   the back to the
271e0 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
271f0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
27200 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
27210 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
27220 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
27230 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
27240 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
27250 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
27260 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
27270 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
27280 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
27290 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
272a0 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
272b0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
272c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
272d0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
272e0 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
272f0 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
27300 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
27310 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
27320 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
27330 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
27340 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
27350 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
27360 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
27370 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20  r->atLast = 0;. 
27380 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
27390 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
273a0 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  e ){.    *pRes =
273b0 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
273c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
273d0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
273e0 78 74 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72  xt<0 ){.    pCur
273f0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
27400 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
27410 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27420 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  _OK;.  }.  pCur-
27430 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a  >skipNext = 0;..
27440 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
27450 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27460 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
27470 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
27480 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
27490 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64  af ){.    int id
274a0 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
274b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
274c0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
274d0 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
274e0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
274f0 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66  , idx)));.    if
27500 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
27510 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
27520 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
27530 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
27540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
27550 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
27560 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29  Cur->iPage]==0 )
27570 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
27580 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
27590 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
275a0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
275b0 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52  LID;.        *pR
275c0 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  es = 1;.        
275d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
275e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
275f0 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
27600 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  r);.    }.    pC
27610 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
27620 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
27630 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20  lidNKey = 0;..  
27640 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
27650 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
27660 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
27670 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
27680 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ge];.    if( pPa
27690 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
276a0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
276b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
276c0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
276d0 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
276e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
276f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
27700 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  }.  }.  *pRes = 
27710 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
27720 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
27730 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
27740 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
27750 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
27760 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
27770 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
27780 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
27790 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
277a0 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
277b0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
277c0 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
277d0 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
277e0 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
277f0 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
27800 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
27810 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
27820 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
27830 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
27840 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
27850 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
27860 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
27870 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
27880 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
27890 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
278a0 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
278b0 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
278c0 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61  age and *pPgno a
278d0 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  re undefined in 
278e0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
278f0 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  error..** Do not
27900 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50   invoke sqlite3P
27910 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a  agerUnref() on *
27920 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72  ppPage if an err
27930 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
27940 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
27950 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
27960 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
27970 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74   (feeble) effort
27980 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
27990 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
279a0 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
279b0 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
279c0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
279d0 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
279e0 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
279f0 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
27a00 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
27a10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27a20 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
27a30 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
27a40 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
27a50 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
27a60 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d  he "exact" param
27a70 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61  eter is not 0, a
27a80 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  nd the page-numb
27a90 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73  er nearby exists
27aa0 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e   .** anywhere on
27ab0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
27ac0 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65  then it is guare
27ad0 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
27ae0 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73  rned. This.** is
27af0 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75   only used by au
27b00 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
27b10 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74  ses when allocat
27b20 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e  ing a new table.
27b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
27b40 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
27b50 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
27b60 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a  t, .  MemPage **
27b70 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20  ppPage, .  Pgno 
27b80 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20  *pPgno, .  Pgno 
27b90 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61  nearby,.  u8 exa
27ba0 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ct.){.  MemPage 
27bb0 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
27bc0 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20  c;.  u32 n;     
27bd0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
27be0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
27bf0 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20  st */.  u32 k;  
27c00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
27c10 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
27c20 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
27c30 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
27c40 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
27c50 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
27c60 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20  unk = 0;.  Pgno 
27c70 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54  mxPage;     /* T
27c80 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  otal size of the
27c90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
27ca0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
27cb0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
27cc0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
27cd0 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
27ce0 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20  Page1;.  mxPage 
27cf0 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
27d00 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74  (pBt);.  n = get
27d10 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
27d20 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73  Data[36]);.  tes
27d30 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65  tcase( n==mxPage
27d40 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d  -1 );.  if( n>=m
27d50 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  xPage ){.    ret
27d60 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
27d70 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
27d80 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
27d90 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
27da0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
27db0 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
27dc0 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
27dd0 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
27de0 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
27df0 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
27e00 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
27e10 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
27e20 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
27e30 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
27e40 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65  'exact' paramete
27e50 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61  r was true and a
27e60 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f   query of the po
27e70 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a  inter-map.    **
27e80 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20   shows that the 
27e90 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
27ea0 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68   somewhere on th
27eb0 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
27ec0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74  n.    ** the ent
27ed0 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ire-list will be
27ee0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
27ef0 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  at page..    */.
27f00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27f10 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
27f20 20 20 20 69 66 28 20 65 78 61 63 74 20 26 26 20     if( exact && 
27f30 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29  nearby<=mxPage )
27f40 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65  {.      u8 eType
27f50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27f60 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20  nearby>0 );.    
27f70 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
27f80 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
27f90 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
27fa0 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26  t(pBt, nearby, &
27fb0 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20  eType, 0);.     
27fc0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
27fd0 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65   rc;.      if( e
27fe0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
27ff0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
28000 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
28010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
28020 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a  pPgno = nearby;.
28030 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
28040 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
28050 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75  he free-list cou
28060 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72  nt by 1. Set iTr
28070 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78  unk to the index
28080 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
28090 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74  irst free-list t
280a0 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76  runk page. iPrev
280b0 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c  Trunk is initial
280c0 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ly 1..    */.   
280d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
280e0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
280f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
28100 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
28110 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26  ;.    put4byte(&
28120 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
28130 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  ], n-1);..    /*
28140 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e   The code within
28150 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75   this loop is ru
28160 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74  n only once if t
28170 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20  he 'searchList' 
28180 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20  variable.    ** 
28190 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68  is not true. Oth
281a0 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20  erwise, it runs 
281b0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72  once for each tr
281c0 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a  unk-page on the.
281d0 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74      ** free-list
281e0 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20   until the page 
281f0 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
28200 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
28210 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
28220 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
28230 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
28240 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
28250 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
28260 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
28270 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
28280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
28290 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
282a0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
282b0 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
282c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
282d0 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
282e0 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b        if( iTrunk
282f0 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  >mxPage ){.     
28300 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
28310 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
28320 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28330 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
28340 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
28350 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
28360 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
28370 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54  rc ){.        pT
28380 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
28390 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
283a0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
283b0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
283c0 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20  pTrunk!=0 );.   
283d0 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
283e0 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 0a  k->aData!=0 );..
283f0 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
28400 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
28410 61 5b 34 5d 29 3b 20 2f 2a 20 23 20 6f 66 20 6c  a[4]); /* # of l
28420 65 61 76 65 73 20 6f 6e 20 74 68 69 73 20 74 72  eaves on this tr
28430 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  unk page */.    
28440 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
28450 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
28460 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
28470 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
28480 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
28490 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
284a0 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
284b0 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
284c0 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
284d0 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
284e0 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
284f0 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
28500 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
28510 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
28520 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
28530 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
28540 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
28550 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
28560 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
28570 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
28580 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
28590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
285a0 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
285b0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
285c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
285d0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
285e0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
285f0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
28600 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
28610 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
28620 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
28630 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
28640 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
28650 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
28660 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
28670 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e  f( k>(u32)(pBt->
28680 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
28690 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
286a0 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75  Value of k is ou
286b0 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74  t of range.  Dat
286c0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
286d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
286e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
286f0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
28700 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
28710 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  page;.#ifndef SQ
28720 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
28730 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65  CUUM.      }else
28740 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20   if( searchList 
28750 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  && nearby==iTrun
28760 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
28770 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
28780 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
28790 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
287a0 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
287b0 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
287c0 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
287d0 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
287e0 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
287f0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
28800 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e  t( *pPgno==iTrun
28810 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  k );.        *pp
28820 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
28830 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
28840 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
28850 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28860 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
28870 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
28880 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
28890 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
288a0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
288b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
288c0 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
288d0 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
288e0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
288f0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
28900 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
28910 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
28920 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
28930 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
28940 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
28950 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
28960 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
28970 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
28980 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
289a0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
289b0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
289c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
289d0 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75  memcpy(&pPrevTru
289e0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
289f0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
28a00 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
28a10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
28a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28a30 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72   trunk page is r
28a40 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63  equired by the c
28a50 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e  aller but it con
28a60 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20  tains .         
28a70 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   ** pointers to 
28a80 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73  free-list leaves
28a90 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66  . The first leaf
28aa0 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b   becomes a trunk
28ab0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
28ac0 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
28ad0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
28ae0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
28af0 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20  *pNewTrunk;.    
28b00 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54        Pgno iNewT
28b10 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
28b20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
28b30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
28b40 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61  ( iNewTrunk>mxPa
28b50 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  ge ){ .         
28b60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
28b70 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
28b80 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
28b90 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
28ba0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28bb0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
28bc0 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
28bd0 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
28be0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
28bf0 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
28c00 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
28c10 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
28c20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
28c40 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
28c50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
28c60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28c70 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
28c80 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
28c90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
28ca0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28cb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
28cc0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
28cd0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
28ce0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
28cf0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
28d00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28d10 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
28d20 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
28d30 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
28d40 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
28d50 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
28d60 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
28d70 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
28d80 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
28d90 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
28da0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
28db0 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
28dc0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
28dd0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
28de0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
28df0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
28e00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
28e10 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
28e20 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
28e30 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
28e40 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
28e50 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
28e60 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
28e70 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
28e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
28e90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
28ea0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
28eb0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
28ec0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
28ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
28ee0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
28ef0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
28f00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
28f10 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
28f20 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
28f30 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
28f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28f50 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
28f60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
28f70 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
28f80 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
28f90 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
28fa0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
28fb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
28fc0 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
28fd0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
28fe0 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
28ff0 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
29000 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
29010 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
29020 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
29030 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
29040 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
29050 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
29060 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
29070 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
29080 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20       int dist;. 
29090 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
290a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
290b0 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62  dist = sqlite3Ab
290c0 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
290d0 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
290e0 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
290f0 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b  for(i=1; i<k; i+
29100 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
29110 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
29120 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
29130 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
29140 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
29150 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
29160 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
29170 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
29180 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
29190 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
291a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
291b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
291c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
291d0 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
291e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
291f0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
29200 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
29210 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4]);.        tes
29220 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
29230 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
29240 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
29250 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
29260 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
29270 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
29280 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
29290 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
292a0 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74    }.        test
292b0 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50  case( iPage==mxP
292c0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  age );.        i
292d0 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c  f( !searchList |
292e0 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20  | iPage==nearby 
292f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
29300 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
29310 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
29320 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
29330 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
29340 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
29350 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
29360 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
29370 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
29380 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
29390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293a0 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
293b0 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
293c0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
293d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
293e0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
293f0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
29400 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
29410 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
29420 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
29430 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
29440 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
29450 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
29460 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
29470 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
29480 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
29490 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
294a0 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
294b0 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
294c0 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
294d0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
294e0 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  *pPgno);.       
294f0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
29500 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
29510 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  , ppPage, noCont
29520 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
29530 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29540 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
29550 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
29560 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
29570 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
29580 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
29590 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
295a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
295b0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
295c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
295d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
295e0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
295f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
29600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
29610 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
29620 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
29630 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
29640 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
29650 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
29660 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
29670 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
29680 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72   freelist, so cr
29690 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
296a0 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  at the.    ** en
296b0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  d of the file */
296c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
296d0 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
296e0 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
296f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
29700 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
29710 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
29720 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
29730 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
29740 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e  GE(pBt) ) pBt->n
29750 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66  Page++;..#ifndef
29760 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
29770 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
29780 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
29790 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
297a0 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
297b0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
297c0 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
297d0 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
297e0 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
297f0 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
29800 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
29810 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
29820 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
29830 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
29840 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
29850 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
29860 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
29870 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
29880 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
29890 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
298a0 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
298b0 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
298c0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
298d0 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
298e0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
298f0 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  \n", pBt->nPage)
29900 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29910 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e   pBt->nPage!=PEN
29920 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
29930 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
29940 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
29950 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20  Bt, pBt->nPage, 
29960 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20  &pPg, 1);.      
29970 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29980 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
29990 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
299a0 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
299b0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
299c0 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
299d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
299e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
299f0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
29a00 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
29a10 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
29a20 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
29a30 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
29a40 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
29a50 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
29a60 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
29a70 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
29a80 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
29a90 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
29aa0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
29ab0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
29ac0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
29ad0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
29ae0 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
29af0 6f 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20  o, ppPage, 1);. 
29b00 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
29b10 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
29b20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29b30 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
29b40 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
29b50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29b60 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
29b70 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
29b80 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
29b90 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
29ba0 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
29bb0 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
29bc0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
29bd0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
29be0 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f  GE(pBt) );..end_
29bf0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20  allocate_page:. 
29c00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
29c10 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  unk);.  releaseP
29c20 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
29c30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
29c40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
29c50 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
29c60 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
29c70 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29  e)->pDbPage)>1 )
29c80 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
29c90 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
29ca0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29cb0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
29cc0 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
29cd0 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
29ce0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
29cf0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
29d00 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
29d10 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
29d20 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
29d30 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
29d40 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
29d50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
29d60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
29d70 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65  used to add page
29d80 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61   iPage to the da
29d90 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65  tabase file free
29da0 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73  -list. .** It is
29db0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
29dc0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
29dd0 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20  ready a part of 
29de0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
29df0 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70  *.** The value p
29e00 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
29e10 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
29e20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
29e30 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66   optional..** If
29e40 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70   the caller happ
29e50 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f  ens to have a po
29e60 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d  inter to the Mem
29e70 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20  Page object .** 
29e80 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
29e90 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64   page iPage hand
29ea0 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69  y, it may pass i
29eb0 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  t as the second 
29ec0 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72  value. .** Other
29ed0 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73  wise, it may pas
29ee0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  s NULL..**.** If
29ef0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
29f00 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69  MemPage object i
29f10 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
29f20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
29f30 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63  .** its referenc
29f40 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61  e count is not a
29f50 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  ltered by this f
29f60 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
29f70 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32  ic int freePage2
29f80 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
29f90 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67  MemPage *pMemPag
29fa0 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a  e, Pgno iPage){.
29fb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
29fc0 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
29fd0 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69        /* Free-li
29fe0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
29ff0 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d  .  Pgno iTrunk =
2a000 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2a010 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2a020 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69  umber of free-li
2a030 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  st trunk page */
2a040 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61   .  MemPage *pPa
2a050 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
2a060 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  1;      /* Local
2a070 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
2a080 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ge 1 */.  MemPag
2a090 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
2a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a0b0 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   Page being free
2a0c0 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  d. May be NULL. 
2a0d0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2a100 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn Code */.  int
2a110 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
2a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a130 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
2a140 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66  er of pages on f
2a150 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  ree-list */..  a
2a160 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2a170 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
2a180 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2a190 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20  t( iPage>1 );.  
2a1a0 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67  assert( !pMemPag
2a1b0 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70  e || pMemPage->p
2a1c0 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20  gno==iPage );.. 
2a1d0 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b   if( pMemPage ){
2a1e0 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65  .    pPage = pMe
2a1f0 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74  mPage;.    sqlit
2a200 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65  e3PagerRef(pPage
2a210 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65  ->pDbPage);.  }e
2a220 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  lse{.    pPage =
2a230 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
2a240 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
2a250 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
2a260 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
2a270 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
2a280 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
2a290 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2a2a0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
2a2b0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
2a2c0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46  eepage_out;.  nF
2a2d0 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
2a2e0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2a2f0 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ]);.  put4byte(&
2a300 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
2a310 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20  ], nFree+1);..  
2a320 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
2a330 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
2a340 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  ELETE ){.    /* 
2a350 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  If the secure_de
2a360 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  lete option is e
2a370 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  nabled, then.   
2a380 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
2a390 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
2a3a0 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
2a3b0 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a  ith zeros..    *
2a3c0 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67  /.    if( (!pPag
2a3d0 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65  e && ((rc = btre
2a3e0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
2a3f0 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
2a400 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20  !=0) ).     ||  
2a410 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d            ((rc =
2a420 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2a430 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2a440 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20  e))!=0).    ){. 
2a450 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
2a460 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
2a470 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
2a480 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
2a490 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
2a4a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2a4b0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
2a4c0 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
2a4d0 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
2a4e0 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
2a4f0 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
2a500 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
2a510 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
2a520 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2a530 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70  UM ){.    ptrmap
2a540 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
2a550 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
2a560 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66   0, &rc);.    if
2a570 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
2a580 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
2a590 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61   /* Now manipula
2a5a0 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  te the actual da
2a5b0 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
2a5c0 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72   structure. Ther
2a5d0 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70  e are two.  ** p
2a5e0 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66  ossibilities. If
2a5f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
2a600 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74  s currently empt
2a610 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72  y, or if the fir
2a620 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61  st.  ** trunk pa
2a630 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
2a640 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65  ist is full, the
2a650 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c  n this page will
2a660 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e   become a.  ** n
2a670 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  ew free-list tru
2a680 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  nk page. Otherwi
2a690 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f  se, it will beco
2a6a0 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  me a leaf of the
2a6b0 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
2a6c0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75  k page in the cu
2a6d0 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e  rrent free-list.
2a6e0 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
2a6f0 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20  s if it.  ** is 
2a700 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
2a710 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65  the page as a ne
2a720 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  w free-list leaf
2a730 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ..  */.  if( nFr
2a740 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ee!=0 ){.    u32
2a750 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   nLeaf;         
2a760 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
2a770 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  l number of leaf
2a780 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20   cells on trunk 
2a790 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72  page */..    iTr
2a7a0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2a7b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2a7c0 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  ]);.    rc = btr
2a7d0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2a7e0 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
2a7f0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
2a800 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a810 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2a820 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
2a830 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
2a840 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2a850 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [4]);.    assert
2a860 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
2a870 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20  e>32 );.    if( 
2a880 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74  nLeaf > (u32)pBt
2a890 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
2a8a0 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   2 ){.      rc =
2a8b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2a8c0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
2a8d0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2a8e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65     }.    if( nLe
2a8f0 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75  af < (u32)pBt->u
2a900 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
2a910 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
2a920 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
2a930 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72  s room on the tr
2a940 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65  unk page to inse
2a950 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rt the page.    
2a960 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64    ** being freed
2a970 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a   as a new leaf..
2a980 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2a990 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
2a9a0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
2a9b0 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
2a9c0 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
2a9d0 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
2a9e0 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
2a9f0 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
2aa00 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
2aa10 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
2aa20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
2aa30 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
2aa40 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
2aa50 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
2aa60 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
2aa70 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
2aa80 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
2aa90 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
2aaa0 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
2aab0 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
2aac0 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
2aad0 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
2aae0 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
2aaf0 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
2ab00 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
2ab10 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
2ab20 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
2ab30 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
2ab40 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
2ab50 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73   continue to res
2ab60 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
2ab70 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
2ab80 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
2ab90 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
2aba0 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
2abb0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
2abc0 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
2abd0 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
2abe0 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
2abf0 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
2ac00 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
2ac10 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
2ac20 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
2ac30 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
2ac40 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
2ac50 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
2ac60 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  4-8"..      */. 
2ac70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ac80 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
2ac90 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
2aca0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2acb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2acc0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
2acd0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
2ace0 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
2acf0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
2ad00 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
2ad10 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
2ad20 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
2ad30 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
2ad40 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
2ad50 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
2ad60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2ad70 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
2ad80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2ad90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
2ada0 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
2adb0 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
2adc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2add0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
2ade0 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
2adf0 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
2ae00 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
2ae10 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
2ae20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2ae30 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
2ae40 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
2ae50 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
2ae60 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
2ae70 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
2ae80 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
2ae90 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
2aea0 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
2aeb0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
2aec0 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
2aed0 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
2aee0 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
2aef0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
2af00 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
2af10 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
2af20 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
2af30 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
2af40 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
2af50 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
2af60 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
2af70 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
2af80 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
2af90 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
2afa0 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
2afb0 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
2afc0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
2afd0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2afe0 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
2aff0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
2b000 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
2b010 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2b020 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2b030 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
2b040 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2b050 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
2b060 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
2b070 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
2b080 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
2b090 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
2b0a0 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
2b0b0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2b0c0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
2b0d0 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
2b0e0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
2b0f0 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
2b100 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
2b110 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
2b120 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
2b130 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
2b140 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
2b150 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
2b160 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2b170 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
2b180 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
2b190 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
2b1a0 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
2b1b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
2b1c0 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
2b1d0 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
2b1e0 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
2b1f0 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
2b200 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
2b210 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
2b220 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
2b230 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
2b240 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2b250 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a  the given Cell..
2b260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
2b270 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  earCell(MemPage 
2b280 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64  *pPage, unsigned
2b290 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20   char *pCell){. 
2b2a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2b2b0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
2b2c0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
2b2d0 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
2b2e0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
2b2f0 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c  Ovfl;.  u32 ovfl
2b300 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
2b310 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2b320 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2b330 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2b340 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
2b350 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
2b360 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e  &info);.  if( in
2b370 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  fo.iOverflow==0 
2b380 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2b390 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
2b3a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
2b3b0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
2b3c0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
2b3d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c  .  }.  if( pCell
2b3e0 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b  +info.iOverflow+
2b3f0 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  3 > pPage->aData
2b400 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65  +pPage->maskPage
2b410 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2b420 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2b430 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74  PT;  /* Cell ext
2b440 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66  ends past end of
2b450 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f   page */.  }.  o
2b460 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
2b470 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
2b480 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73  Overflow]);.  as
2b490 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
2b4a0 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f  eSize > 4 );.  o
2b4b0 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42  vflPageSize = pB
2b4c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
2b4d0 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e  4;.  nOvfl = (in
2b4e0 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e  fo.nPayload - in
2b4f0 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c  fo.nLocal + ovfl
2b500 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76  PageSize - 1)/ov
2b510 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  flPageSize;.  as
2b520 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d  sert( ovflPgno==
2b530 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a  0 || nOvfl>0 );.
2b540 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d    while( nOvfl--
2b550 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65   ){.    Pgno iNe
2b560 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50  xt = 0;.    MemP
2b570 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
2b580 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f      if( ovflPgno
2b590 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62  <2 || ovflPgno>b
2b5a0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
2b5b0 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30  t) ){.      /* 0
2b5c0 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20   is not a legal 
2b5d0 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
2b5e0 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65  page 1 cannot be
2b5f0 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76   an .      ** ov
2b600 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65  erflow page. The
2b610 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67  refore if ovflPg
2b620 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65  no<2 or past the
2b630 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20   end of the .   
2b640 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64     ** file the d
2b650 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
2b660 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20  corrupt. */.    
2b670 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b680 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2b690 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66    }.    if( nOvf
2b6a0 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
2b6b0 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
2b6c0 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26  pBt, ovflPgno, &
2b6d0 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a  pOvfl, &iNext);.
2b6e0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2b6f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2b700 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c  .    if( ( pOvfl
2b710 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74   || ((pOvfl = bt
2b720 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
2b730 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30  t, ovflPgno))!=0
2b740 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  ) ).     && sqli
2b750 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
2b760 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50  ount(pOvfl->pDbP
2b770 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20  age)!=1.    ){. 
2b780 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73       /* There is
2b790 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63   no reason any c
2b7a0 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76  ursor should hav
2b7b0 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  e an outstanding
2b7c0 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20   reference .    
2b7d0 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66    ** to an overf
2b7e0 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69  low page belongi
2b7f0 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61  ng to a cell tha
2b800 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74  t is being delet
2b810 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20  ed/updated..    
2b820 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65    ** So if there
2b830 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61   exists more tha
2b840 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  n one reference 
2b850 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  to this page, th
2b860 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20  en it .      ** 
2b870 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20  must not really 
2b880 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
2b890 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  age and the data
2b8a0 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
2b8b0 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20  rupt. .      ** 
2b8c0 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f  It is helpful to
2b8d0 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66   detect this bef
2b8e0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65  ore calling free
2b8f0 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20  Page2(), as .   
2b900 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28     ** freePage2(
2b910 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70  ) may zero the p
2b920 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20  age contents if 
2b930 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
2b940 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65  de is.      ** e
2b950 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20  nabled. If this 
2b960 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20  'overflow' page 
2b970 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
2b980 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20  page that the.  
2b990 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73      ** caller is
2b9a0 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
2b9b0 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73  gh or using in s
2b9c0 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74  ome other way, t
2b9d0 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e  his.      ** can
2b9e0 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e   be problematic.
2b9f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2ba00 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2ba10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
2ba20 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2ba30 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70  freePage2(pBt, p
2ba40 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b  Ovfl, ovflPgno);
2ba50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2ba60 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73  pOvfl ){.      s
2ba70 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2ba80 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
2ba90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2baa0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2bab0 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69      ovflPgno = i
2bac0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Next;.  }.  retu
2bad0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2bae0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
2baf0 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  e byte sequence 
2bb00 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
2bb10 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  t a cell on page
2bb20 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72   pPage.** and wr
2bb30 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65  ite that byte se
2bb40 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c  quence into pCel
2bb50 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70  l[].  Overflow p
2bb60 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ages are.** allo
2bb70 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64  cated and filled
2bb80 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79   in as necessary
2bb90 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70  .  The calling p
2bba0 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72  rocedure.** is r
2bbb0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
2bbc0 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69  aking sure suffi
2bbd0 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20  cient space has 
2bbe0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  been allocated.*
2bbf0 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a  * for pCell[]..*
2bc00 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
2bc10 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  Cell does not ne
2bc20 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20  cessary need to 
2bc30 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61  point to the pPa
2bc40 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65  ge->aData.** are
2bc50 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  a.  pCell might 
2bc60 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65  point to some te
2bc70 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e  mporary storage.
2bc80 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a    The cell will.
2bc90 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65  ** be constructe
2bca0 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72  d in this tempor
2bcb0 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f  ary area then co
2bcc0 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d  pied into pPage-
2bcd0 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e  >aData.** later.
2bce0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2bcf0 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d  illInCell(.  Mem
2bd00 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
2bd10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2bd20 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
2bd30 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a  tains the cell *
2bd40 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
2bd50 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  r *pCell,       
2bd60 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74     /* Complete t
2bd70 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ext of the cell 
2bd80 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
2bd90 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
2bda0 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
2bdb0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2bdc0 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c  pData,int nData,
2bdd0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
2bde0 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
2bdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be00 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f     /* Extra zero
2be10 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
2be20 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69   to pData */.  i
2be30 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  nt *pnSize      
2be40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2be50 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65   Write cell size
2be60 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2be70 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f  t nPayload;.  co
2be80 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20  nst u8 *pSrc;.  
2be90 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b  int nSrc, n, rc;
2bea0 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74  .  int spaceLeft
2beb0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76  ;.  MemPage *pOv
2bec0 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  fl = 0;.  MemPag
2bed0 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20  e *pToRelease = 
2bee0 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
2bef0 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
2bf00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
2bf10 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
2bf20 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
2bf30 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
2bf40 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Ovfl = 0;.  int 
2bf50 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49  nHeader;.  CellI
2bf60 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73  nfo info;..  ass
2bf70 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2bf80 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2bf90 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
2bfa0 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74   /* pPage is not
2bfb0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69   necessarily wri
2bfc0 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65  teable since pCe
2bfd0 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69  ll might be auxi
2bfe0 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65  liary.  ** buffe
2bff0 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20  r space that is 
2c000 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
2c010 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61  e pPage buffer a
2c020 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  rea */.  assert(
2c030 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44   pCell<pPage->aD
2c040 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70  ata || pCell>=&p
2c050 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
2c060 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
2c070 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2c080 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2c090 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2c0a0 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
2c0b0 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a  in the header. *
2c0c0 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b  /.  nHeader = 0;
2c0d0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
2c0e0 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  eaf ){.    nHead
2c0f0 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69  er += 4;.  }.  i
2c100 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
2c110 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  a ){.    nHeader
2c120 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
2c130 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
2c140 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d  Data+nZero);.  }
2c150 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20  else{.    nData 
2c160 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d  = nZero = 0;.  }
2c170 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75  .  nHeader += pu
2c180 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
2c190 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29  Header], *(u64*)
2c1a0 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50  &nKey);.  btreeP
2c1b0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2c1c0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
2c1d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
2c1e0 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65  .nHeader==nHeade
2c1f0 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  r );.  assert( i
2c200 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29  nfo.nKey==nKey )
2c210 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
2c220 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44  .nData==(u32)(nD
2c230 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20  ata+nZero) );.  
2c240 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
2c250 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e  e payload */.  n
2c260 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20  Payload = nData 
2c270 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70  + nZero;.  if( p
2c280 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
2c290 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61      pSrc = pData
2c2a0 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61  ;.    nSrc = nDa
2c2b0 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  ta;.    nData = 
2c2c0 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20  0;.  }else{ .   
2c2d0 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e   if( NEVER(nKey>
2c2e0 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b  0x7fffffff || pK
2c2f0 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ey==0) ){.      
2c300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2c310 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2c320 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b  }.    nPayload +
2c330 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20  = (int)nKey;.   
2c340 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
2c350 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b    nSrc = (int)nK
2c360 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a  ey;.  }.  *pnSiz
2c370 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a  e = info.nSize;.
2c380 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e    spaceLeft = in
2c390 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61  fo.nLocal;.  pPa
2c3a0 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
2c3b0 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f  Header];.  pPrio
2c3c0 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  r = &pCell[info.
2c3d0 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77  iOverflow];..  w
2c3e0 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
2c3f0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
2c400 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  eLeft==0 ){.#ifn
2c410 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c420 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
2c430 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
2c440 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
2c450 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
2c460 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
2c470 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
2c480 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2c490 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
2c4a0 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
2c4b0 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
2c4c0 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
2c4d0 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
2c4e0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
2c4f0 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
2c500 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
2c510 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
2c520 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2c530 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
2c540 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2c550 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
2c560 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
2c570 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2c580 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2c590 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
2c5a0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
2c5b0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
2c5c0 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
2c5d0 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
2c5e0 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
2c5f0 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
2c600 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
2c610 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
2c620 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
2c630 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
2c640 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
2c650 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
2c660 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
2c670 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
2c680 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
2c690 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
2c6a0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
2c6b0 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
2c6c0 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
2c6d0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
2c6e0 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
2c6f0 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
2c700 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
2c710 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
2c720 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
2c730 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
2c740 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
2c750 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  sed values and d
2c760 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
2c770 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
2c780 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2c790 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2c7a0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2c7b0 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
2c7c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c7d0 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
2c7e0 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
2c7f0 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
2c800 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
2c810 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
2c820 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79  t, pgnoOvfl, eTy
2c830 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20  pe, pgnoPtrmap, 
2c840 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
2c850 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2c860 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
2c870 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
2c880 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2c890 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2c8a0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2c8b0 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
2c8c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2c8d0 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
2c8e0 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
2c8f0 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
2c900 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
2c910 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
2c920 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
2c930 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
2c940 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
2c950 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
2c960 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
2c970 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
2c980 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
2c990 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2c9a0 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
2c9b0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
2c9c0 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
2c9d0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
2c9e0 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
2c9f0 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
2ca00 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
2ca10 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
2ca20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
2ca30 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
2ca40 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
2ca50 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
2ca60 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
2ca70 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
2ca80 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2ca90 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2caa0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
2cab0 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
2cac0 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
2cad0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
2cae0 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
2caf0 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
2cb00 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
2cb10 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
2cb20 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2cb30 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
2cb40 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
2cb50 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
2cb60 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
2cb70 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2cb80 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 4;.    }.    
2cb90 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
2cba0 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
2cbb0 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
2cbc0 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54  t;..    /* If pT
2cbd0 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
2cbe0 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f  zero than pPaylo
2cbf0 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  ad points into t
2cc00 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
2cc10 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
2cc20 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
2cc30 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
2cc40 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
2cc50 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
2cc60 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
2cc70 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2cc80 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
2cc90 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2cca0 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64    /* If pPayload
2ccb0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
2ccc0 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
2ccd0 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
2cce0 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20  re pPage.    ** 
2ccf0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
2cd00 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  le */.    assert
2cd10 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65  ( pPayload<pPage
2cd20 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c  ->aData || pPayl
2cd30 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  oad>=&pPage->aDa
2cd40 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
2cd50 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
2cd60 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2cd70 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2cd80 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
2cd90 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20   if( nSrc>0 ){. 
2cda0 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20       if( n>nSrc 
2cdb0 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20  ) n = nSrc;.    
2cdc0 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
2cdd0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
2cde0 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
2cdf0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2ce00 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
2ce10 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
2ce20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
2ce30 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  = n;.    pPayloa
2ce40 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
2ce50 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
2ce60 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
2ce70 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
2ce80 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nSrc==0 ){.   
2ce90 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
2cea0 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44  .      pSrc = pD
2ceb0 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
2cec0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
2ced0 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
2cee0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2cef0 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
2cf00 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
2cf10 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
2cf20 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
2cf30 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
2cf40 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
2cf50 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
2cf60 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
2cf70 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
2cf80 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
2cf90 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
2cfa0 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
2cfb0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
2cfc0 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
2cfd0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
2cfe0 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
2cff0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
2d000 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
2d010 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2d020 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
2d030 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
2d040 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
2d050 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
2d060 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  sz, int *pRC){. 
2d070 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20   u32 pc;        
2d080 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
2d090 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65  ll content of ce
2d0a0 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
2d0b0 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
2d0c0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e        /* pPage->
2d0d0 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70  aData */.  u8 *p
2d0e0 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73  tr;        /* Us
2d0f0 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73  ed to move bytes
2d100 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64   around within d
2d110 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 65  ata[] */.  u8 *e
2d120 6e 64 50 74 72 3b 20 20 20 20 20 2f 2a 20 45 6e  ndPtr;     /* En
2d130 64 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  d of loop */.  i
2d140 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
2d150 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
2d160 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  e */.  int hdr; 
2d170 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e         /* Beginn
2d180 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65  ing of the heade
2d190 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73  r.  0 most pages
2d1a0 2e 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f  .  100 page 1 */
2d1b0 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
2d1c0 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
2d1d0 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
2d1e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2d1f0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
2d200 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64  llSize(pPage, id
2d210 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2d220 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2d230 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2d240 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
2d250 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2d260 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
2d270 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
2d280 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2d290 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50  ata;.  ptr = &pP
2d2a0 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  age->aCellIdx[2*
2d2b0 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74  idx];.  pc = get
2d2c0 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64  2byte(ptr);.  hd
2d2d0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
2d2e0 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65  fset;.  testcase
2d2f0 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26  ( pc==get2byte(&
2d300 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a  data[hdr+5]) );.
2d310 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
2d320 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  z==pPage->pBt->u
2d330 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69  sableSize );.  i
2d340 66 28 20 70 63 20 3c 20 28 75 33 32 29 67 65 74  f( pc < (u32)get
2d350 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2d360 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70  5]) || pc+sz > p
2d370 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2d380 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52  eSize ){.    *pR
2d390 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
2d3a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
2d3b0 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  urn;.  }.  rc = 
2d3c0 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c  freeSpace(pPage,
2d3d0 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20   pc, sz);.  if( 
2d3e0 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  rc ){.    *pRC =
2d3f0 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
2d400 0a 20 20 7d 0a 20 20 65 6e 64 50 74 72 20 3d 20  .  }.  endPtr = 
2d410 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  &pPage->aCellIdx
2d420 5b 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  [2*pPage->nCell 
2d430 2d 20 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  - 2];.  assert( 
2d440 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
2d450 4e 54 28 70 74 72 29 26 31 29 3d 3d 30 20 29 3b  NT(ptr)&1)==0 );
2d460 20 20 2f 2a 20 70 74 72 20 69 73 20 61 6c 77 61    /* ptr is alwa
2d470 79 73 20 32 2d 62 79 74 65 20 61 6c 69 67 6e 65  ys 2-byte aligne
2d480 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 74  d */.  while( pt
2d490 72 3c 65 6e 64 50 74 72 20 29 7b 0a 20 20 20 20  r<endPtr ){.    
2d4a0 2a 28 75 31 36 2a 29 70 74 72 20 3d 20 2a 28 75  *(u16*)ptr = *(u
2d4b0 31 36 2a 29 26 70 74 72 5b 32 5d 3b 0a 20 20 20  16*)&ptr[2];.   
2d4c0 20 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20   ptr += 2;.  }. 
2d4d0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
2d4e0 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
2d4f0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
2d500 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65  >nCell);.  pPage
2d510 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a  ->nFree += 2;.}.
2d520 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
2d530 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67  new cell on pPag
2d540 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20  e at cell index 
2d550 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e  "i".  pCell poin
2d560 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ts to the.** con
2d570 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tent of the cell
2d580 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
2d590 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  ell content will
2d5a0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
2d5b0 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68  , then put it th
2d5c0 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77  ere.  If it.** w
2d5d0 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65  ill not fit, the
2d5e0 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  n make a copy of
2d5f0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2d600 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a  t into pTemp if.
2d610 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20  ** pTemp is not 
2d620 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73  null.  Regardles
2d630 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f  s of pTemp, allo
2d640 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  cate a new entry
2d650 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70  .** in pPage->ap
2d660 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
2d670 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
2d680 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
2d690 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
2d6a0 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
2d6b0 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
2d6c0 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
2d6d0 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
2d6e0 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
2d6f0 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
2d700 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
2d710 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2d720 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
2d730 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
2d740 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2d750 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
2d760 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
2d770 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
2d780 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
2d790 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
2d7a0 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
2d7b0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
2d7c0 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
2d7d0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
2d7e0 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
2d7f0 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
2d800 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2d810 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
2d820 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
2d830 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
2d840 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c  c void insertCel
2d850 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
2d860 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
2d870 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
2d880 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
2d890 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
2d8a0 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
2d8b0 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
2d8c0 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
2d8d0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
2d8e0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
2d8f0 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
2d900 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
2d910 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2d920 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
2d930 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
2d940 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
2d950 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
2d960 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
2d970 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  eeded */.  Pgno 
2d980 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20  iChild,      /* 
2d990 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70  If non-zero, rep
2d9a0 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74  lace first 4 byt
2d9b0 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c  es with this val
2d9c0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43  ue */.  int *pRC
2d9d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
2d9e0 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75  d and write retu
2d9f0 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72  rn code from her
2da00 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
2da10 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57  x = 0;      /* W
2da20 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
2da30 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
2da40 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
2da50 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
2da60 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2da70 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20  */.  int end;   
2da80 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2da90 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61  byte past the la
2daa0 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
2dab0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
2dac0 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20  nt ins;         
2dad0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74   /* Index in dat
2dae0 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65  a[] where new ce
2daf0 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e  ll pointer is in
2db00 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
2db10 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a  cellOffset;   /*
2db20 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73   Address of firs
2db30 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
2db40 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
2db50 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
2db60 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
2db70 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
2db80 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
2db90 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2dba0 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72  for moving infor
2dbb0 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e  mation around in
2dbc0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
2dbd0 2a 65 6e 64 50 74 72 3b 20 20 20 20 20 20 20 2f  *endPtr;       /
2dbe0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
2dbf0 70 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69  p */..  int nSki
2dc00 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20  p = (iChild ? 4 
2dc10 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52  : 0);..  if( *pR
2dc20 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
2dc30 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
2dc40 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
2dc50 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
2dc60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2dc70 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
2dc80 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26  LL(pPage->pBt) &
2dc90 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  & MX_CELL(pPage-
2dca0 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a  >pBt)<=10921 );.
2dcb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2dcc0 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61  >nOverflow<=Arra
2dcd0 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
2dce0 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
2dcf0 28 20 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  ( ArraySize(pPag
2dd00 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61  e->apOvfl)==Arra
2dd10 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f  ySize(pPage->aiO
2dd20 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
2dd30 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2dd40 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2dd50 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
2dd60 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20  The cell should 
2dd70 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65  normally be size
2dd80 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f  d correctly.  Ho
2dd90 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69  wever, when movi
2dda0 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72  ng a.  ** malfor
2ddb0 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20  med cell from a 
2ddc0 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20  leaf page to an 
2ddd0 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69  interior page, i
2dde0 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a  f the cell size.
2ddf0 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62    ** wanted to b
2de00 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75  e less than 4 bu
2de10 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70  t got rounded up
2de20 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61   to 4 on the lea
2de30 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a  f, then size.  *
2de40 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20  * might be less 
2de50 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a  than 8 (leaf-siz
2de60 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20  e + pointer) on 
2de70 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
2de80 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74  e.  Hence.  ** t
2de90 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68  he term after th
2dea0 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c  e || in the foll
2deb0 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
2dec0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  */.  assert( sz=
2ded0 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
2dee0 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73  ge, pCell) || (s
2def0 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30  z==8 && iChild>0
2df00 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
2df10 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
2df20 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
2df30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
2df40 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
2df50 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70  y(pTemp+nSkip, p
2df60 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
2df70 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65  Skip);.      pCe
2df80 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
2df90 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  }.    if( iChild
2dfa0 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
2dfb0 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64  te(pCell, iChild
2dfc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  );.    }.    j =
2dfd0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2dfe0 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
2dff0 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   j<(int)(sizeof(
2e000 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73  pPage->apOvfl)/s
2e010 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f  izeof(pPage->apO
2e020 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20  vfl[0])) );.    
2e030 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d  pPage->apOvfl[j]
2e040 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
2e050 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d  age->aiOvfl[j] =
2e060 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65   (u16)i;.  }else
2e070 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
2e080 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2e090 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2e0a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2e0b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e0c0 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
2e0d0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
2e0e0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2e0f0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2e100 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2e110 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
2e120 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
2e130 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d      cellOffset =
2e140 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
2e150 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65  et;.    end = ce
2e160 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
2e170 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
2e180 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
2e190 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20  + 2*i;.    rc = 
2e1a0 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
2e1b0 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a  age, sz, &idx);.
2e1c0 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70      if( rc ){ *p
2e1d0 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b  RC = rc; return;
2e1e0 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c   }.    /* The al
2e1f0 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f  locateSpace() ro
2e200 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73  utine guarantees
2e210 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
2e220 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20  wo properties.  
2e230 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72    ** if it retur
2e240 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  ns success */.  
2e250 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d    assert( idx >=
2e260 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73   end+2 );.    as
2e270 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20  sert( idx+sz <= 
2e280 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
2e290 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
2e2a0 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
2e2b0 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
2e2c0 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b  ree -= (u16)(2 +
2e2d0 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79   sz);.    memcpy
2e2e0 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
2e2f0 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
2e300 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69  sz-nSkip);.    i
2e310 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
2e320 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
2e330 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
2e340 0a 20 20 20 20 7d 0a 20 20 20 20 70 74 72 20 3d  .    }.    ptr =
2e350 20 26 64 61 74 61 5b 65 6e 64 5d 3b 0a 20 20 20   &data[end];.   
2e360 20 65 6e 64 50 74 72 20 3d 20 26 64 61 74 61 5b   endPtr = &data[
2e370 69 6e 73 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  ins];.    assert
2e380 28 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  ( (SQLITE_PTR_TO
2e390 5f 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30 20  _INT(ptr)&1)==0 
2e3a0 29 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61 6c  );  /* ptr is al
2e3b0 77 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69 67  ways 2-byte alig
2e3c0 6e 65 64 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  ned */.    while
2e3d0 28 20 70 74 72 3e 65 6e 64 50 74 72 20 29 7b 0a  ( ptr>endPtr ){.
2e3e0 20 20 20 20 20 20 2a 28 75 31 36 2a 29 70 74 72        *(u16*)ptr
2e3f0 20 3d 20 2a 28 75 31 36 2a 29 26 70 74 72 5b 2d   = *(u16*)&ptr[-
2e400 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 20 2d 3d  2];.      ptr -=
2e410 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75   2;.    }.    pu
2e420 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
2e430 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
2e440 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
2e450 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
2e460 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
2e470 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2e480 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2e490 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
2e4a0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2e4b0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
2e4c0 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
2e4d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
2e4e0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
2e4f0 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
2e500 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
2e510 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
2e520 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
2e530 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
2e540 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  */.      ptrmapP
2e550 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
2e560 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20   pCell, pRC);.  
2e570 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
2e580 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69  ../*.** Add a li
2e590 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  st of cells to a
2e5a0 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
2e5b0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
2e5c0 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54  ally empty..** T
2e5d0 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61  he cells are gua
2e5e0 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f  ranteed to fit o
2e5f0 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
2e600 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d  tatic void assem
2e610 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  blePage(.  MemPa
2e620 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
2e630 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61  The page to be a
2e640 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69  ssemblied */.  i
2e650 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
2e660 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
2e670 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
2e680 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  o this page */. 
2e690 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
2e6a0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
2e6b0 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f  o cell bodies */
2e6c0 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20  .  u16 *aSize   
2e6d0 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
2e6e0 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b   the cells */.){
2e6f0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
2e700 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2e710 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43  nter */.  u8 *pC
2e720 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41  ellptr;     /* A
2e730 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
2e740 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
2e750 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20   int cellbody;  
2e760 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2e770 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20   next cell body 
2e780 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
2e790 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2e7a0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
2e7b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
2e7c0 61 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f  ata for pPage */
2e7d0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
2e7e0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
2e7f0 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  set;           /
2e800 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
2e810 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  er on pPage */. 
2e820 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62   const int nUsab
2e830 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  le = pPage->pBt-
2e840 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20  >usableSize; /* 
2e850 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70  Usable size of p
2e860 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  age */..  assert
2e870 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2e880 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
2e890 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2e8a0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2e8b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2e8c0 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26  sert( nCell>=0 &
2e8d0 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58  & nCell<=(int)MX
2e8e0 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2e8f0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  ).            &&
2e900 20 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50   (int)MX_CELL(pP
2e910 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31  age->pBt)<=10921
2e920 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2e930 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2e940 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2e950 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  age) );..  /* Ch
2e960 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  eck that the pag
2e970 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
2e980 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61  zeroed by zeroPa
2e990 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74  ge() */.  assert
2e9a0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
2e9b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67  0 );.  assert( g
2e9c0 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
2e9d0 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55  data[hdr+5])==nU
2e9e0 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c  sable );..  pCel
2e9f0 6c 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61  lptr = &pPage->a
2ea00 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d  CellIdx[nCell*2]
2ea10 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e  ;.  cellbody = n
2ea20 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d  Usable;.  for(i=
2ea30 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69  nCell-1; i>=0; i
2ea40 2d 2d 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 20  --){.    u16 sz 
2ea50 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  = aSize[i];.    
2ea60 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20  pCellptr -= 2;. 
2ea70 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73     cellbody -= s
2ea80 7a 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  z;.    put2byte(
2ea90 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f  pCellptr, cellbo
2eaa0 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  dy);.    memcpy(
2eab0 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
2eac0 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b   apCell[i], sz);
2ead0 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28  .  }.  put2byte(
2eae0 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43  &data[hdr+3], nC
2eaf0 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ell);.  put2byte
2eb00 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
2eb10 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67  ellbody);.  pPag
2eb20 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65  e->nFree -= (nCe
2eb30 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d  ll*2 + nUsable -
2eb40 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50   cellbody);.  pP
2eb50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31  age->nCell = (u1
2eb60 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  6)nCell;.}../*.*
2eb70 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2eb80 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
2eb90 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
2eba0 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
2ebb0 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
2ebc0 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
2ebd0 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
2ebe0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
2ebf0 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
2ec00 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
2ec10 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
2ec20 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
2ec30 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
2ec40 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
2ec50 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
2ec60 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
2ec70 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
2ec80 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
2ec90 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
2eca0 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
2ecb0 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
2ecc0 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
2ecd0 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
2ece0 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
2ecf0 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
2ed00 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
2ed10 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
2ed20 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
2ed30 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
2ed40 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
2ed50 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
2ed60 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
2ed70 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
2ed80 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
2ed90 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
2eda0 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
2edb0 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
2edc0 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
2edd0 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
2ede0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2edf0 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
2ee00 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
2ee10 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
2ee20 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
2ee30 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
2ee40 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
2ee50 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
2ee60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2ee70 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
2ee80 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
2ee90 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
2eea0 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
2eeb0 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
2eec0 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
2eed0 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
2eee0 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
2eef0 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
2ef00 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
2ef10 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
2ef20 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
2ef30 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
2ef40 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
2ef50 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
2ef60 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
2ef70 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61   of trying to ba
2ef80 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68  lance the 3 righ
2ef90 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
2efa0 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61  s, just add.** a
2efb0 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
2efc0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
2efd0 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65   and put the one
2efe0 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a   new entry in.**
2eff0 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69   that page.  Thi
2f000 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67  s leaves the rig
2f010 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  ht side of the t
2f020 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20  ree somewhat.** 
2f030 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74  unbalanced.  But
2f040 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77   odds are that w
2f050 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
2f060 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a  ing new entries.
2f070 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
2f080 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f  on afterwards so
2f090 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74   the nearly empt
2f0a0 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63  y page will quic
2f0b0 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20  kly.** fill up. 
2f0c0 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a   On average..**.
2f0d0 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
2f0e0 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
2f0f0 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
2f100 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
2f110 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69  ee..** pParent i
2f120 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70  s its parent.  p
2f130 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  Page must have a
2f140 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77   single overflow
2f150 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20   entry.** which 
2f160 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
2f170 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20  t-most entry on 
2f180 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
2f190 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
2f1a0 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  r is used to sto
2f1b0 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  re a temporary c
2f1c0 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64  opy of the divid
2f1d0 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20  er.** cell that 
2f1e0 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
2f1f0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53   into pParent. S
2f200 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69  uch a cell consi
2f210 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79  sts of a 4.** by
2f220 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  te page number f
2f230 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72  ollowed by a var
2f240 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
2f250 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a  eger. In other.*
2f260 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74  * words, at most
2f270 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65   13 bytes. Hence
2f280 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
2f290 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a  er must be at.**
2f2a0 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20   least 13 bytes 
2f2b0 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
2f2c0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
2f2d0 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  uick(MemPage *pP
2f2e0 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a  arent, MemPage *
2f2f0 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63  pPage, u8 *pSpac
2f300 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
2f310 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67  const pBt = pPag
2f320 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d  e->pBt;    /* B-
2f330 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f  Tree Database */
2f340 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
2f350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f360 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
2f370 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2f380 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2f3b0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
2f3c0 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20  no pgnoNew;     
2f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3e0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2f3f0 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20  r of pNew */..  
2f400 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2f410 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2f420 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2f430 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2f440 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2f450 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
2f460 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
2f470 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2f480 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ow==1 );..  /* T
2f490 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  his error condit
2f4a0 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ion is now caugh
2f4b0 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68  t prior to reach
2f4c0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
2f4d0 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  n */.  if( pPage
2f4e0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74  ->nCell==0 ) ret
2f4f0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2f500 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41  PT_BKPT;..  /* A
2f510 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
2f520 67 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69  ge. This page wi
2f530 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69  ll become the ri
2f540 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a  ght-sibling of .
2f550 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65    ** pPage. Make
2f560 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2f570 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68   writable, so th
2f580 61 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  at the new divid
2f590 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79  er cell.  ** may
2f5a0 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66   be inserted. If
2f5b0 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72   both these oper
2f5c0 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65  ations are succe
2f5d0 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a  ssful, proceed..
2f5e0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f    */.  rc = allo
2f5f0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2f600 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e  t, &pNew, &pgnoN
2f610 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66  ew, 0, 0);..  if
2f620 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f630 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74  ){..    u8 *pOut
2f640 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20   = &pSpace[4];. 
2f650 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70     u8 *pCell = p
2f660 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b  Page->apOvfl[0];
2f670 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20  .    u16 szCell 
2f680 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2f690 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
2f6a0 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20   u8 *pStop;..   
2f6b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2f6c0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2f6d0 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20  (pNew->pDbPage) 
2f6e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2f6f0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d  Page->aData[0]==
2f700 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
2f710 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41  LEAFDATA|PTF_LEA
2f720 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  F) );.    zeroPa
2f730 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54  ge(pNew, PTF_INT
2f740 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
2f750 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20  |PTF_LEAF);.    
2f760 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
2f770 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73  w, 1, &pCell, &s
2f780 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  zCell);..    /* 
2f790 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
2f7a0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
2f7b0 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
2f7c0 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a  ointer map.    *
2f7d0 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66  * with entries f
2f7e0 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c  or the new page,
2f7f0 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72   and any pointer
2f800 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a   from the .    *
2f810 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61  * cell on the pa
2f820 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ge to an overflo
2f830 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65  w page. If eithe
2f840 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a  r of these.    *
2f850 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69  * operations fai
2f860 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63  ls, the return c
2f870 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20  ode is set, but 
2f880 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20  the contents.   
2f890 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e   ** of the paren
2f8a0 74 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c  t page are still
2f8b0 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20   manipulated by 
2f8c0 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a  thh code below..
2f8d0 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f      ** That is O
2f8e0 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  k, at this point
2f8f0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2f900 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2f910 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b  o.    ** be mark
2f920 65 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74  ed as dirty. Ret
2f930 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
2f940 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20  code will cause 
2f950 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  a.    ** rollbac
2f960 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63  k, undoing any c
2f970 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
2f980 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
2f990 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
2f9a0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2f9b0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
2f9c0 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52  Bt, pgnoNew, PTR
2f9d0 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
2f9e0 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  nt->pgno, &rc);.
2f9f0 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
2fa00 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  >pNew->minLocal 
2fa10 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  ){.        ptrma
2fa20 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77  pPutOvflPtr(pNew
2fa30 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20  , pCell, &rc);. 
2fa40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
2fa50 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
2fa60 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20  divider cell to 
2fa70 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72  insert into pPar
2fa80 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72  ent. The divider
2fa90 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e   cell.    ** con
2faa0 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74  sists of a 4-byt
2fab0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74  e page number (t
2fac0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
2fad0 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20  f pPage) and.   
2fae0 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c   ** a variable l
2faf0 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20  ength key value 
2fb00 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 74  (which must be t
2fb10 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73  he same value as
2fb20 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67   the.    ** larg
2fb30 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65  est key on pPage
2fb40 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
2fb50 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72   To find the lar
2fb60 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f  gest key value o
2fb70 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20 66  n pPage, first f
2fb80 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  ind the right-mo
2fb90 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20  st .    ** cell 
2fba0 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66 69  on pPage. The fi
2fbb0 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f  rst two fields o
2fbc0 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20  f this cell are 
2fbd0 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f  the .    ** reco
2fbe0 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72  rd-length (a var
2fbf0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
2fc00 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d  eger at most 32-
2fc10 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20  bits in size).  
2fc20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79    ** and the key
2fc30 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61 62   value (a variab
2fc40 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
2fc50 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20  r, may have any 
2fc60 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54  value)..    ** T
2fc70 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20  he first of the 
2fc80 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73  while(...) loops
2fc90 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65   below skips ove
2fca0 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e  r the record-len
2fcb0 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  gth.    ** field
2fcc0 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69  . The second whi
2fcd0 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70  le(...) loop cop
2fce0 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75  ies the key valu
2fcf0 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  e from the.    *
2fd00 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  * cell on pPage 
2fd10 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65 20  into the pSpace 
2fd20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  buffer..    */. 
2fd30 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2fd40 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65  ell(pPage, pPage
2fd50 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20  ->nCell-1);.    
2fd60 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
2fd70 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
2fd80 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20  (pCell++)&0x80) 
2fd90 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29  && pCell<pStop )
2fda0 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70  ;.    pStop = &p
2fdb0 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Cell[9];.    whi
2fdc0 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20  le( ((*(pOut++) 
2fdd0 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78  = *(pCell++))&0x
2fde0 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
2fdf0 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  op );..    /* In
2fe00 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69 76  sert the new div
2fe10 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70  ider cell into p
2fe20 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69  Parent. */.    i
2fe30 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
2fe40 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  t, pParent->nCel
2fe50 6c 2c 20 70 53 70 61 63 65 2c 20 28 69 6e 74 29  l, pSpace, (int)
2fe60 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a 20  (pOut-pSpace),. 
2fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
2fe80 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72   pPage->pgno, &r
2fe90 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  c);..    /* Set 
2fea0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
2feb0 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72 65  pointer of pPare
2fec0 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  nt to point to t
2fed0 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a  he new page. */.
2fee0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2fef0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
2ff00 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
2ff10 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20  8], pgnoNew);.  
2ff20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
2ff30 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
2ff40 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a   the new page. *
2ff50 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  /.    releasePag
2ff60 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20  e(pNew);.  }..  
2ff70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
2ff80 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2ff90 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20  IT_QUICKBALANCE 
2ffa0 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20  */..#if 0./*.** 
2ffb0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
2ffc0 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74  es not contribut
2ffd0 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  e anything to th
2ffe0 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 53  e operation of S
2fff0 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20  QLite..** it is 
30000 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76 61  sometimes activa
30010 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79 20  ted temporarily 
30020 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67 20  while debugging 
30030 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c 65  code responsible
30040 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e 67   .** for setting
30050 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
30060 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
30070 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b 50  int ptrmapCheckP
30080 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61  ages(MemPage **a
30090 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67 65  pPage, int nPage
300a0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
300b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67   for(i=0; i<nPag
300c0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e  e; i++){.    Pgn
300d0 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20  o n;.    u8 e;. 
300e0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
300f0 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20  e = apPage[i];. 
30100 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
30110 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
30120 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
30130 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20  ->isInit );..   
30140 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67   for(j=0; j<pPag
30150 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a  e->nCell; j++){.
30160 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
30170 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a  nfo;.      u8 *z
30180 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a 20  ;.     .      z 
30190 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
301a0 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62 74 72 65  , j);.      btre
301b0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
301c0 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a  age, z, &info);.
301d0 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
301e0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
301f0 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
30200 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f  get4byte(&z[info
30210 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
30220 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
30230 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26  pBt, ovfl, &e, &
30240 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
30250 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
30260 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
30270 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20  OVERFLOW1 );.   
30280 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
30290 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
302a0 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c         Pgno chil
302b0 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b  d = get4byte(z);
302c0 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47  .        ptrmapG
302d0 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26  et(pBt, child, &
302e0 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
302f0 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
30300 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
30310 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  MAP_BTREE );.   
30320 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
30330 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
30340 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
30350 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26  ild = get4byte(&
30360 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
30370 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
30380 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47  );.      ptrmapG
30390 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26  et(pBt, child, &
303a0 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73  e, &n);.      as
303b0 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
303c0 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
303d0 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d  P_BTREE );.    }
303e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
303f0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
30400 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
30410 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74  s used to copy t
30420 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
30430 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73  he b-tree node s
30440 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67  tored .** on pag
30450 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
30460 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72  pTo. If page pFr
30470 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61  om was not a lea
30480 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20  f page, then.** 
30490 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
304a0 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68  entries for each
304b0 20 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20   child page are 
304c0 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20  updated so that 
304d0 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61  the.** parent pa
304e0 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ge stored in the
304f0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20   pointer map is 
30500 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72  page pTo. If pFr
30510 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  om contained.** 
30520 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f  any cells with o
30530 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
30540 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20  nters, then the 
30550 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
30560 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
30570 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70  ries are also up
30580 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  dated so that th
30590 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
305a0 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a   page pTo..**.**
305b0 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72   If pFrom is cur
305c0 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20  rently carrying 
305d0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  any overflow cel
305e0 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74  ls (entries in t
305f0 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 70  he.** MemPage.ap
30600 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74  Ovfl[] array), t
30610 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69  hey are not copi
30620 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a  ed to pTo. .**.*
30630 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
30640 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20  ng, page pTo is 
30650 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73  reinitialized us
30660 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61 67  ing btreeInitPag
30670 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  e()..**.** The p
30680 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68  erformance of th
30690 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
306a0 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74 20  ot critical. It 
306b0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
306c0 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65 5f  .** the balance_
306d0 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20  shallower() and 
306e0 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
306f0 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65 69   procedures, nei
30700 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68  ther of.** which
30710 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74 65   are called ofte
30720 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63  n under normal c
30730 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f  ircumstances..*/
30740 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 70  .static void cop
30750 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d  yNodeContent(Mem
30760 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d  Page *pFrom, Mem
30770 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a  Page *pTo, int *
30780 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
30790 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
307a0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 20  .    BtShared * 
307b0 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f  const pBt = pFro
307c0 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20 2a  m->pBt;.    u8 *
307d0 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70   const aFrom = p
307e0 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20  From->aData;.   
307f0 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20   u8 * const aTo 
30800 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20  = pTo->aData;.  
30810 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f    int const iFro
30820 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64  mHdr = pFrom->hd
30830 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e 74  rOffset;.    int
30840 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d 20   const iToHdr = 
30850 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20  ((pTo->pgno==1) 
30860 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20 20  ? 100 : 0);.    
30870 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
30880 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20  iData;.  .  .   
30890 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
308a0 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61 73  isInit );.    as
308b0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72  sert( pFrom->nFr
308c0 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20  ee>=iToHdr );.  
308d0 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79    assert( get2by
308e0 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
308f0 64 72 2b 35 5d 29 20 3c 3d 20 28 69 6e 74 29 70  dr+5]) <= (int)p
30900 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
30910 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79  ;.  .    /* Copy
30920 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65   the b-tree node
30930 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 70 61   content from pa
30940 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65  ge pFrom to page
30950 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69 44 61   pTo. */.    iDa
30960 74 61 20 3d 20 67 65 74 32 62 79 74 65 28 26 61  ta = get2byte(&a
30970 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d  From[iFromHdr+5]
30980 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  );.    memcpy(&a
30990 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72 6f  To[iData], &aFro
309a0 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e 75  m[iData], pBt->u
309b0 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61 29  sableSize-iData)
309c0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 54  ;.    memcpy(&aT
309d0 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f  o[iToHdr], &aFro
309e0 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72  m[iFromHdr], pFr
309f0 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  om->cellOffset +
30a00 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29   2*pFrom->nCell)
30a10 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 69 6e  ;.  .    /* Rein
30a20 69 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54  itialize page pT
30a30 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  o so that the co
30a40 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65  ntents of the Me
30a50 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 0a  mPage structure.
30a60 20 20 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65      ** match the
30a70 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65 20 69   new data. The i
30a80 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
30a90 20 70 54 6f 20 63 61 6e 20 61 63 74 75 61 6c 6c   pTo can actuall
30aa0 79 20 66 61 69 6c 20 75 6e 64 65 72 0a 20 20 20  y fail under.   
30ab0 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73 63 75   ** fairly obscu
30ac0 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  re circumstances
30ad0 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  , even though it
30ae0 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 69 6e   is a copy of in
30af0 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a  itialized .    *
30b00 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a 20 20  * page pFrom..  
30b10 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e 69 73    */.    pTo->is
30b20 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 72 63  Init = 0;.    rc
30b30 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
30b40 28 70 54 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  (pTo);.    if( r
30b50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30b60 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b        *pRC = rc;
30b70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
30b80 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
30b90 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
30ba0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
30bb0 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
30bc0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
30bd0 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6e 79  s.    ** for any
30be0 20 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72 66   b-tree or overf
30bf0 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 70  low pages that p
30c00 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  To now contains 
30c10 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e  the pointers to.
30c20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
30c30 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
30c40 20 20 20 20 20 20 2a 70 52 43 20 3d 20 73 65 74        *pRC = set
30c50 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f  ChildPtrmaps(pTo
30c60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
30c70 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
30c80 6e 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73  ne redistributes
30c90 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 50   cells on the iP
30ca0 61 72 65 6e 74 49 64 78 27 74 68 20 63 68 69 6c  arentIdx'th chil
30cb0 64 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a 2a 20  d of pParent.** 
30cc0 28 68 65 72 65 61 66 74 65 72 20 22 74 68 65 20  (hereafter "the 
30cd0 70 61 67 65 22 29 20 61 6e 64 20 75 70 20 74 6f  page") and up to
30ce0 20 32 20 73 69 62 6c 69 6e 67 73 20 73 6f 20 74   2 siblings so t
30cf0 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61  hat all pages ha
30d00 76 65 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20  ve about the.** 
30d10 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66 20 66  same amount of f
30d20 72 65 65 20 73 70 61 63 65 2e 20 55 73 75 61 6c  ree space. Usual
30d30 6c 79 20 61 20 73 69 6e 67 6c 65 20 73 69 62 6c  ly a single sibl
30d40 69 6e 67 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ing on either si
30d50 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  de of the.** pag
30d60 65 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  e are used in th
30d70 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 6f  e balancing, tho
30d80 75 67 68 20 62 6f 74 68 20 73 69 62 6c 69 6e 67  ugh both sibling
30d90 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f  s might come fro
30da0 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20 69 66  m one.** side if
30db0 20 74 68 65 20 70 61 67 65 20 69 73 20 74 68 65   the page is the
30dc0 20 66 69 72 73 74 20 6f 72 20 6c 61 73 74 20 63   first or last c
30dd0 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65  hild of its pare
30de0 6e 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  nt. If the page 
30df0 0a 2a 2a 20 68 61 73 20 66 65 77 65 72 20 74 68  .** has fewer th
30e00 61 6e 20 32 20 73 69 62 6c 69 6e 67 73 20 28 73  an 2 siblings (s
30e10 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63  omething which c
30e20 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
30e30 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 73  f the page.** is
30e40 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20   a root page or 
30e50 61 20 63 68 69 6c 64 20 6f 66 20 61 20 72 6f 6f  a child of a roo
30e60 74 20 70 61 67 65 29 20 74 68 65 6e 20 61 6c 6c  t page) then all
30e70 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62 6c 69   available sibli
30e80 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63 69 70 61  ngs.** participa
30e90 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
30ea0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ing..**.** The n
30eb0 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
30ec0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6d 69  s of the page mi
30ed0 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ght be increased
30ee0 20 6f 72 20 64 65 63 72 65 61 73 65 64 20 62 79   or decreased by
30ef0 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77 6f 20   .** one or two 
30f00 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20  in an effort to 
30f10 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72 6c  keep pages nearl
30f20 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f  y full but not o
30f30 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a  ver full. .**.**
30f40 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20   Note that when 
30f50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
30f60 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20  called, some of 
30f70 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65  the cells on the
30f80 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e   page.** might n
30f90 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ot actually be s
30fa0 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61 67 65  tored in MemPage
30fb0 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69 73 20 63  .aData[]. This c
30fc0 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20  an happen.** if 
30fd0 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65 72  the page is over
30fe0 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75 74 69  full. This routi
30ff0 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
31000 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f 63 61  all cells alloca
31010 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ted.** to the pa
31020 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
31030 6e 67 73 20 66 69 74 20 69 6e 74 6f 20 4d 65 6d  ngs fit into Mem
31040 50 61 67 65 2e 61 44 61 74 61 5b 5d 20 62 65 66  Page.aData[] bef
31050 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
31060 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72  *.** In the cour
31070 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20  se of balancing 
31080 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73  the page and its
31090 20 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c 6c 73   siblings, cells
310a0 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73 65 72   may be.** inser
310b0 74 65 64 20 69 6e 74 6f 20 6f 72 20 72 65 6d 6f  ted into or remo
310c0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ved from the par
310d0 65 6e 74 20 70 61 67 65 20 28 70 50 61 72 65 6e  ent page (pParen
310e0 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20  t). Doing so.** 
310f0 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 70 61  may cause the pa
31100 72 65 6e 74 20 70 61 67 65 20 74 6f 20 62 65 63  rent page to bec
31110 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  ome overfull or 
31120 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20 74 68  underfull. If th
31130 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c 20 69  is.** happens, i
31140 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
31150 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
31160 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b 65 20  aller to invoke 
31170 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 62  the correct.** b
31180 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65  alancing routine
31190 20 74 6f 20 66 69 78 20 74 68 69 73 20 70 72 6f   to fix this pro
311a0 62 6c 65 6d 20 28 73 65 65 20 74 68 65 20 62 61  blem (see the ba
311b0 6c 61 6e 63 65 28 29 20 72 6f 75 74 69 6e 65 29  lance() routine)
311c0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  . .**.** If this
311d0 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66   routine fails f
311e0 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69  or any reason, i
311f0 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68  t might leave th
31200 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e  e database.** in
31210 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61   a corrupted sta
31220 74 65 2e 20 53 6f 20 69 66 20 74 68 69 73 20 72  te. So if this r
31230 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68  outine fails, th
31240 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
31250 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62  d.** be rolled b
31260 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ack..**.** The t
31270 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  hird argument to
31280 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
31290 61 4f 76 66 6c 53 70 61 63 65 2c 20 69 73 20 61  aOvflSpace, is a
312a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a   pointer to a.**
312b0 20 62 75 66 66 65 72 20 62 69 67 20 65 6e 6f 75   buffer big enou
312c0 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65 20 70  gh to hold one p
312d0 61 67 65 2e 20 49 66 20 77 68 69 6c 65 20 69 6e  age. If while in
312e0 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69 6e  serting cells in
312f0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a 2a  to the parent.**
31300 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 20   page (pParent) 
31310 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
31320 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c  becomes overfull
31330 2c 20 74 68 69 73 20 62 75 66 66 65 72 20 69 73  , this buffer is
31340 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
31350 65 20 74 68 65 20 70 61 72 65 6e 74 27 73 20 6f  e the parent's o
31360 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 42  verflow cells. B
31370 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63  ecause this func
31380 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a 20  tion inserts.** 
31390 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f 75  a maximum of fou
313a0 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  r divider cells 
313b0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
313c0 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d 61  page, and the ma
313d0 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66  ximum.** size of
313e0 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20 77   a cell stored w
313f0 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61  ithin an interna
31400 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  l node is always
31410 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a 2a   less than 1/4.*
31420 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69  * of the page-si
31430 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70 61  ze, the aOvflSpa
31440 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20 67  ce[] buffer is g
31450 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
31460 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 20  large.** enough 
31470 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77  for all overflow
31480 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   cells..**.** If
31490 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20 73   aOvflSpace is s
314a0 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f 69  et to a null poi
314b0 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
314c0 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
314d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
314e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53  .#if defined(_MS
314f0 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43 5f 56  C_VER) && _MSC_V
31500 45 52 20 3e 3d 20 31 37 30 30 20 26 26 20 64 65  ER >= 1700 && de
31510 66 69 6e 65 64 28 5f 4d 5f 41 52 4d 29 0a 23 70  fined(_M_ARM).#p
31520 72 61 67 6d 61 20 6f 70 74 69 6d 69 7a 65 28 22  ragma optimize("
31530 22 2c 20 6f 66 66 29 0a 23 65 6e 64 69 66 0a 73  ", off).#endif.s
31540 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
31550 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d  e_nonroot(.  Mem
31560 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20  Page *pParent,  
31570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31580 50 61 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73  Parent page of s
31590 69 62 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61  iblings being ba
315a0 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  lanced */.  int 
315b0 69 50 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20  iParentIdx,     
315c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
315d0 6e 64 65 78 20 6f 66 20 22 74 68 65 20 70 61 67  ndex of "the pag
315e0 65 22 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  e" in pParent */
315f0 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63  .  u8 *aOvflSpac
31600 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
31610 20 20 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20     /* page-size 
31620 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
31630 6f 72 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a  or parent ovfl *
31640 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f 74 2c 20  /.  int isRoot, 
31650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31660 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
31670 50 61 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74  Parent is a root
31680 2d 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 62  -page */.  int b
31690 42 75 6c 6b 20 20 20 20 20 20 20 20 20 20 20 20  Bulk            
316a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
316b0 75 65 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  ue if this call 
316c0 69 73 20 70 61 72 74 20 6f 66 20 61 20 62 75 6c  is part of a bul
316d0 6b 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 42  k load */.){.  B
316e0 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
316f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
31700 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73  he whole databas
31710 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
31720 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
31730 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
31740 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
31750 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  [] */.  int nMax
31760 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20  Cells = 0;      
31770 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
31780 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c  d size of apCell
31790 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e  , szCell, aFrom.
317a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d   */.  int nNew =
317b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
317c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
317d0 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d  pages in apNew[]
317e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20   */.  int nOld; 
317f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31800 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
31810 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d  pages in apOld[]
31820 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20   */.  int i, j, 
31830 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
31840 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
31850 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44  ers */.  int nxD
31860 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
31870 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69        /* Next di
31880 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50  vider slot in pP
31890 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
318a0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
318b0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
318c0 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
318d0 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61  ode */.  u16 lea
318e0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20  fCorrection;    
318f0 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50        /* 4 if pP
31900 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
31910 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e  0 if not */.  in
31920 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20  t leafData;     
31930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
31940 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61  ue if pPage is a
31950 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44   leaf of a LEAFD
31960 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e  ATA tree */.  in
31970 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20  t usableSpace;  
31980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
31990 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79  tes in pPage bey
319a0 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a  ond the header *
319b0 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67  /.  int pageFlag
319c0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
319d0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61   /* Value of pPa
319e0 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a  ge->aData[0] */.
319f0 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20    int subtotal; 
31a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31a10 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79  * Subtotal of by
31a20 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20  tes in cells on 
31a30 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  one page */.  in
31a40 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20  t iSpace1 = 0;  
31a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
31a60 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
31a70 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a  of aSpace1[] */.
31a80 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61 63 65    int iOvflSpace
31a90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
31aa0 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
31ab0 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70 61 63  yte of aOvflSpac
31ac0 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  e[] */.  int szS
31ad0 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  cratch;         
31ae0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
31af0 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
31b00 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d  requested */.  M
31b10 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42  emPage *apOld[NB
31b20 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  ];          /* p
31b30 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74  Page and up to t
31b40 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  wo siblings */. 
31b50 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79   MemPage *apCopy
31b60 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a  [NB];         /*
31b70 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73 20   Private copies 
31b80 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73  of apOld[] pages
31b90 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
31ba0 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  pNew[NB+2];     
31bb0 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
31bc0 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67  up to NB sibling
31bd0 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e  s after balancin
31be0 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69 67 68  g */.  u8 *pRigh
31bf0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
31c00 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20      /* Location 
31c10 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72 69 67  in parent of rig
31c20 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74  ht-sibling point
31c30 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69  er */.  u8 *apDi
31c40 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20 20 20  v[NB-1];        
31c50 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20       /* Divider 
31c60 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
31c70 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77   */.  int cntNew
31c80 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
31c90 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
31ca0 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61  Cell[] of cell a
31cb0 66 74 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a  fter i-th page *
31cc0 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42  /.  int szNew[NB
31cd0 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
31ce0 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a   /* Combined siz
31cf0 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65  e of cells place
31d00 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f   on i-th page */
31d10 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d  .  u8 **apCell =
31d20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
31d30 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
31d40 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
31d50 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
31d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31d70 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
31d80 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
31d90 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53  ll[] */.  u8 *aS
31da0 70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20  pace1;          
31db0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
31dc0 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69  for copies of di
31dd0 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a  viders cells */.
31de0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
31df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31e00 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20 73 74  * Temp var to st
31e10 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ore a page numbe
31e20 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d  r in */..  pBt =
31e30 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20   pParent->pBt;. 
31e40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31e50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
31e60 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
31e70 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
31e80 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
31e90 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
31ea0 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41 43 45  ;..#if 0.  TRACE
31eb0 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
31ec0 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
31ed0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
31ee0 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
31ef0 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  pgno));.#endif..
31f00 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
31f10 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79 20 68  nt pParent may h
31f20 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
31f30 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41  overflow cell. A
31f40 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69 73 20  nd if.  ** this 
31f50 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73  overflow cell is
31f60 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d 75 73   present, it mus
31f70 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20 77 69  t be the cell wi
31f80 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  th .  ** index i
31f90 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69 73 20  ParentIdx. This 
31fa0 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61  scenario comes a
31fb0 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73 20 66  bout when this f
31fc0 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
31fd0 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65 63 74  called (indirect
31fe0 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ly) from sqlite3
31ff0 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e 0a 20  BtreeDelete().. 
32000 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
32010 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
32020 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
32030 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
32040 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
32050 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  t->nOverflow==0 
32060 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76  || pParent->aiOv
32070 66 6c 5b 30 5d 3d 3d 69 50 61 72 65 6e 74 49 64  fl[0]==iParentId
32080 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76  x );..  if( !aOv
32090 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72  flSpace ){.    r
320a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
320b0 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  EM;.  }..  /* Fi
320c0 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  nd the sibling p
320d0 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e  ages to balance.
320e0 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65   Also locate the
320f0 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
32100 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76  t .  ** that div
32110 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ide the siblings
32120 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20  . An attempt is 
32130 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
32140 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a  siblings on .  *
32150 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  * either side of
32160 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62   pPage. More sib
32170 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
32180 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
32190 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66  owever, .  ** if
321a0 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72   there are fewer
321b0 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67   than NN sibling
321c0 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  s on the other s
321d0 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a  ide. If pParent.
321e0 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66    ** has NB or f
321f0 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68  ewer children th
32200 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  en all children 
32210 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74  of pParent are t
32220 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  aken.  .  **.  *
32230 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f  * This loop also
32240 20 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64   drops the divid
32250 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68  er cells from th
32260 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54  e parent page. T
32270 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68  his.  ** way, th
32280 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
32290 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  he function does
322a0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61   not have to dea
322b0 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20  l with any.  ** 
322c0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69  overflow cells i
322d0 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  n the parent pag
322e0 65 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20  e, since if any 
322f0 65 78 69 73 74 65 64 20 74 68 65 79 20 77 69 6c  existed they wil
32300 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65  l.  ** have alre
32310 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  ady been removed
32320 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61  ..  */.  i = pPa
32330 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
32340 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  + pParent->nCell
32350 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20  ;.  if( i<2 ){. 
32360 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
32370 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
32380 74 28 20 62 42 75 6c 6b 3d 3d 30 20 7c 7c 20 62  t( bBulk==0 || b
32390 42 75 6c 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 69  Bulk==1 );.    i
323a0 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30  f( iParentIdx==0
323b0 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
323c0 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76      .      nxDiv
323d0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
323e0 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d  if( iParentIdx==
323f0 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76  i ){.      nxDiv
32400 20 3d 20 69 2d 32 2b 62 42 75 6c 6b 3b 0a 20 20   = i-2+bBulk;.  
32410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
32420 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20  ssert( bBulk==0 
32430 29 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d  );.      nxDiv =
32440 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20   iParentIdx-1;. 
32450 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 2d 62     }.    i = 2-b
32460 42 75 6c 6b 3b 0a 20 20 7d 0a 20 20 6e 4f 6c 64  Bulk;.  }.  nOld
32470 20 3d 20 69 2b 31 3b 0a 20 20 69 66 28 20 28 69   = i+1;.  if( (i
32480 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
32490 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72  nOverflow)==pPar
324a0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
324b0 20 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72    pRight = &pPar
324c0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
324d0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
324e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
324f0 52 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c  Right = findCell
32500 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
32510 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
32520 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e  flow);.  }.  pgn
32530 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69  o = get4byte(pRi
32540 67 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31  ght);.  while( 1
32550 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   ){.    rc = get
32560 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
32570 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d   pgno, &apOld[i]
32580 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
32590 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70  .      memset(ap
325a0 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69  Old, 0, (i+1)*si
325b0 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b  zeof(MemPage*));
325c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  .      goto bala
325d0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
325e0 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73   }.    nMaxCells
325f0 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e   += 1+apOld[i]->
32600 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e  nCell+apOld[i]->
32610 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
32620 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72  f( (i--)==0 ) br
32630 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b  eak;..    if( i+
32640 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e  nxDiv==pParent->
32650 61 69 4f 76 66 6c 5b 30 5d 20 26 26 20 70 50 61  aiOvfl[0] && pPa
32660 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
32670 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69  ){.      apDiv[i
32680 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 70 4f  ] = pParent->apO
32690 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 70 67  vfl[0];.      pg
326a0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70  no = get4byte(ap
326b0 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  Div[i]);.      s
326c0 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69  zNew[i] = cellSi
326d0 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61  zePtr(pParent, a
326e0 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
326f0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
32700 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ow = 0;.    }els
32710 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69  e{.      apDiv[i
32720 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ] = findCell(pPa
32730 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50  rent, i+nxDiv-pP
32740 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
32750 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  );.      pgno = 
32760 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69  get4byte(apDiv[i
32770 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b  ]);.      szNew[
32780 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  i] = cellSizePtr
32790 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b  (pParent, apDiv[
327a0 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44  i]);..      /* D
327b0 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f  rop the cell fro
327c0 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
327d0 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c  e. apDiv[i] stil
327e0 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20  l points to.    
327f0 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69    ** the cell wi
32800 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c  thin the parent,
32810 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
32820 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64  has been dropped
32830 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
32840 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65 20  is safe because 
32850 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20  dropping a cell 
32860 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20  only overwrites 
32870 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
32880 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  ** four bytes of
32890 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75   it, and this fu
328a0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
328b0 6e 65 65 64 20 74 68 65 20 66 69 72 73 74 0a 20  need the first. 
328c0 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74       ** four byt
328d0 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
328e0 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70  r cell. So the p
328f0 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65 20 74  ointer is safe t
32900 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c  o use.      ** l
32910 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20  ater on.  .     
32920 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74   **.      ** But
32930 20 6e 6f 74 20 69 66 20 77 65 20 61 72 65 20 69   not if we are i
32940 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  n secure-delete 
32950 6d 6f 64 65 2e 20 49 6e 20 73 65 63 75 72 65 2d  mode. In secure-
32960 64 65 6c 65 74 65 20 6d 6f 64 65 2c 0a 20 20 20  delete mode,.   
32970 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65     ** the dropCe
32980 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ll() routine wil
32990 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20  l overwrite the 
329a0 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68  entire cell with
329b0 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a   zeroes..      *
329c0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
329d0 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79  temporarily copy
329e0 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74   the cell into t
329f0 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a  he aOvflSpace[].
32a00 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
32a10 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69   It will be copi
32a20 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20  ed out again as 
32a30 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61  soon as the aSpa
32a40 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20  ce[] buffer.    
32a50 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65    ** is allocate
32a60 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
32a70 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
32a80 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
32a90 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  TE ){.        in
32aa0 74 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20  t iOff;..       
32ab0 20 69 4f 66 66 20 3d 20 53 51 4c 49 54 45 5f 50   iOff = SQLITE_P
32ac0 54 52 5f 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b  TR_TO_INT(apDiv[
32ad0 69 5d 29 20 2d 20 53 51 4c 49 54 45 5f 50 54 52  i]) - SQLITE_PTR
32ae0 5f 54 4f 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d  _TO_INT(pParent-
32af0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >aData);.       
32b00 20 69 66 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77   if( (iOff+szNew
32b10 5b 69 5d 29 3e 28 69 6e 74 29 70 42 74 2d 3e 75  [i])>(int)pBt->u
32b20 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
32b30 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
32b40 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
32b50 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
32b60 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31  t(apOld, 0, (i+1
32b70 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  )*sizeof(MemPage
32b80 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  *));.          g
32b90 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
32ba0 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  nup;.        }el
32bb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  se{.          me
32bc0 6d 63 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65  mcpy(&aOvflSpace
32bd0 5b 69 4f 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d  [iOff], apDiv[i]
32be0 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20  , szNew[i]);.   
32bf0 20 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20         apDiv[i] 
32c00 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70  = &aOvflSpace[ap
32c10 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e  Div[i]-pParent->
32c20 61 44 61 74 61 5d 3b 0a 20 20 20 20 20 20 20 20  aData];.        
32c30 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
32c40 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
32c50 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e  , i+nxDiv-pParen
32c60 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a  t->nOverflow, sz
32c70 4e 65 77 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20  New[i], &rc);.  
32c80 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
32c90 6b 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d  ke nMaxCells a m
32ca0 75 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20  ultiple of 4 in 
32cb0 6f 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76  order to preserv
32cc0 65 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c  e 8-byte.  ** al
32cd0 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61  ignment */.  nMa
32ce0 78 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65  xCells = (nMaxCe
32cf0 6c 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20  lls + 3)&~3;..  
32d00 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65  /*.  ** Allocate
32d10 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72   space for memor
32d20 79 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a  y structures.  *
32d30 2f 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67  /.  k = pBt->pag
32d40 65 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73  eSize + ROUND8(s
32d50 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b  izeof(MemPage));
32d60 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20  .  szScratch =. 
32d70 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a        nMaxCells*
32d80 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20  sizeof(u8*)     
32d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32da0 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20    /* apCell */. 
32db0 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a      + nMaxCells*
32dc0 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20  sizeof(u16)     
32dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32de0 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20    /* szCell */. 
32df0 20 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53      + pBt->pageS
32e00 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
32e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e20 20 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a    /* aSpace1 */.
32e30 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20       + k*nOld;  
32e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e60 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 70 69 65     /* Page copie
32e70 73 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20  s (apCopy) */.  
32e80 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33  apCell = sqlite3
32e90 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73  ScratchMalloc( s
32ea0 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69  zScratch ); .  i
32eb0 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a  f( apCell==0 ){.
32ec0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32ed0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
32ee0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
32ef0 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  .  }.  szCell = 
32f00 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d  (u16*)&apCell[nM
32f10 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61  axCells];.  aSpa
32f20 63 65 31 20 3d 20 28 75 38 2a 29 26 73 7a 43 65  ce1 = (u8*)&szCe
32f30 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
32f40 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
32f50 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53  YTE_ALIGNMENT(aS
32f60 70 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a  pace1) );..  /*.
32f70 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65    ** Load pointe
32f80 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20  rs to all cells 
32f90 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  on sibling pages
32fa0 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72   and the divider
32fb0 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
32fc0 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c   the local apCel
32fd0 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65  l[] array.  Make
32fe0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64   copies of the d
32ff0 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
33000 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  * into space obt
33010 61 69 6e 65 64 20 66 72 6f 6d 20 61 53 70 61 63  ained from aSpac
33020 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20  e1[] and remove 
33030 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
33040 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72  s.  ** from pPar
33050 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ent..  **.  ** I
33060 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
33070 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73  re on leaf pages
33080 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
33090 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65   pointers of the
330a0 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65  .  ** divider ce
330b0 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64  lls are stripped
330c0 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20   from the cells 
330d0 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
330e0 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  copied.  ** into
330f0 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20   aSpace1[].  In 
33100 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65  this way, all ce
33110 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
33120 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a  are without.  **
33130 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
33140 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72    If siblings ar
33150 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
33160 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20  en all cell in. 
33170 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63   ** apCell[] inc
33180 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  lude child point
33190 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  ers.  Either way
331a0 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
331b0 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65  pCell[].  ** are
331c0 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a   alike..  **.  *
331d0 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  * leafCorrection
331e0 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73  :  4 if pPage is
331f0 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70   a leaf.  0 if p
33200 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  Page is not a le
33210 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c  af..  **       l
33220 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70  eafData:  1 if p
33230 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64  Page holds key+d
33240 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20  ata and pParent 
33250 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e  holds only keys.
33260 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72  .  */.  leafCorr
33270 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30  ection = apOld[0
33280 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61  ]->leaf*4;.  lea
33290 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d  fData = apOld[0]
332a0 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72  ->hasData;.  for
332b0 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
332c0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69  +){.    int limi
332d0 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42  t;.    .    /* B
332e0 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
332f0 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20  hing else, take 
33300 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27  a copy of the i'
33310 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c  th original sibl
33320 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ing.    ** The r
33330 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63  est of this func
33340 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61  tion will use da
33350 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69  ta from the copi
33360 65 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a  es rather.    **
33370 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
33380 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74  al pages since t
33390 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
333a0 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65  s will be in the
333b0 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
333c0 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  of being overwri
333d0 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65  tten.  */.    Me
333e0 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
333f0 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61  Copy[i] = (MemPa
33400 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74  ge*)&aSpace1[pBt
33410 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69  ->pageSize + k*i
33420 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
33430 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69  ld, apOld[i], si
33440 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
33450 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20      pOld->aData 
33460 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31  = (void*)&pOld[1
33470 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
33480 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64  ld->aData, apOld
33490 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  [i]->aData, pBt-
334a0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
334b0 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
334c0 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
334d0 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 70 4f  flow;.    if( pO
334e0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ld->nOverflow>0 
334f0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  ){.      for(j=0
33500 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
33510 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
33520 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
33530 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65   );.        apCe
33540 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64  ll[nCell] = find
33550 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c  OverflowCell(pOl
33560 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 73  d, j);.        s
33570 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
33580 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
33590 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
335a0 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
335b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
335c0 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 61  lse{.      u8 *a
335d0 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e 61 44 61  Data = pOld->aDa
335e0 74 61 3b 0a 20 20 20 20 20 20 75 31 36 20 6d 61  ta;.      u16 ma
335f0 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64 2d 3e 6d  skPage = pOld->m
33600 61 73 6b 50 61 67 65 3b 0a 20 20 20 20 20 20 75  askPage;.      u
33610 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  16 cellOffset = 
33620 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  pOld->cellOffset
33630 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
33640 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
33650 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
33660 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
33670 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c  );.        apCel
33680 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 43  l[nCell] = findC
33690 65 6c 6c 76 32 28 61 44 61 74 61 2c 20 6d 61 73  ellv2(aData, mas
336a0 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66 66 73 65  kPage, cellOffse
336b0 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 73  t, j);.        s
336c0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
336d0 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
336e0 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
336f0 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
33700 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
33710 20 20 20 20 20 20 0a 20 20 20 20 69 66 28 20 69        .    if( i
33720 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61 66  <nOld-1 && !leaf
33730 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75 31 36  Data){.      u16
33740 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65 77   sz = (u16)szNew
33750 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  [i];.      u8 *p
33760 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65  Temp;.      asse
33770 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
33780 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73 7a 43  lls );.      szC
33790 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
337a0 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26  .      pTemp = &
337b0 61 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d  aSpace1[iSpace1]
337c0 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65 31 20  ;.      iSpace1 
337d0 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
337e0 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61  ert( sz<=pBt->ma
337f0 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20  xLocal+23 );.   
33800 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63     assert( iSpac
33810 65 31 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  e1 <= (int)pBt->
33820 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
33830 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
33840 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20  apDiv[i], sz);. 
33850 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
33860 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
33870 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
33880 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
33890 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65  rection==0 || le
338a0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
338b0 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
338c0 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b  nCell] = szCell[
338d0 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72  nCell] - leafCor
338e0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69  rection;.      i
338f0 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29  f( !pOld->leaf )
33900 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
33910 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
33920 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
33930 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72  ssert( pOld->hdr
33940 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Offset==0 );.   
33950 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
33960 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t pointer of the
33970 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64   child page pOld
33980 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66   becomes the lef
33990 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69  t.        ** poi
339a0 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69  nter of the divi
339b0 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  der cell */.    
339c0 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c      memcpy(apCel
339d0 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d  l[nCell], &pOld-
339e0 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
339f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33a00 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
33a10 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
33a20 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
33a30 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a  ell[nCell]<4 ){.
33a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
33a50 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65  not allow any ce
33a60 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  lls smaller than
33a70 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
33a80 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
33a90 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
33aa0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
33ab0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
33ac0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
33ad0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
33ae0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e  umber of pages n
33af0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c  eeded to hold al
33b00 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20  l nCell cells.. 
33b10 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e   ** Store this n
33b20 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41  umber in "k".  A
33b30 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65  lso compute szNe
33b40 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
33b50 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65   total.  ** size
33b60 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   of all cells on
33b70 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61   the i-th page a
33b80 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63  nd cntNew[] whic
33b90 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20  h is the index. 
33ba0 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20   ** in apCell[] 
33bb0 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
33bc0 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20   divides page i 
33bd0 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20  from page i+1.  
33be0 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20  .  ** cntNew[k] 
33bf0 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65  should equal nCe
33c00 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  ll..  **.  ** Va
33c10 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79  lues computed by
33c20 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a   this block:.  *
33c30 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
33c40 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75   k: The total nu
33c50 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20  mber of sibling 
33c60 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a  pages.  **    sz
33c70 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75  New[i]: Spaced u
33c80 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  sed on the i-th 
33c90 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
33ca0 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20  **   cntNew[i]: 
33cb0 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b  Index in apCell[
33cc0 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66  ] and szCell[] f
33cd0 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  or the first cel
33ce0 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20  l to.  **       
33cf0 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
33d00 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62   of the i-th sib
33d10 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
33d20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d  usableSpace: Num
33d30 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
33d40 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
33d50 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e  on each sibling.
33d60 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73  .  ** .  */.  us
33d70 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d  ableSpace = pBt-
33d80 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32  >usableSize - 12
33d90 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
33da0 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61  n;.  for(subtota
33db0 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  l=k=i=0; i<nCell
33dc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
33dd0 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( i<nMaxCells 
33de0 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20  );.    subtotal 
33df0 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32  += szCell[i] + 2
33e00 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74  ;.    if( subtot
33e10 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65  al > usableSpace
33e20 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b   ){.      szNew[
33e30 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20  k] = subtotal - 
33e40 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
33e50 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a   cntNew[k] = i;.
33e60 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
33e70 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ta ){ i--; }.   
33e80 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b     subtotal = 0;
33e90 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20  .      k++;.    
33ea0 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20    if( k>NB+1 ){ 
33eb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
33ec0 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62  UPT_BKPT; goto b
33ed0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20  alance_cleanup; 
33ee0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a  }.    }.  }.  sz
33ef0 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
33f00 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d  l;.  cntNew[k] =
33f10 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a   nCell;.  k++;..
33f20 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61    /*.  ** The pa
33f30 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62  cking computed b
33f40 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  y the previous b
33f50 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74  lock is biased t
33f60 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e  oward the siblin
33f70 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  gs.  ** on the l
33f80 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c  eft side.  The l
33f90 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65  eft siblings are
33fa0 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66   always nearly f
33fb0 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20  ull, while the. 
33fc0 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73   ** right-most s
33fd0 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
33fe0 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54  nearly empty.  T
33ff0 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  his block of cod
34000 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20  e attempts.  ** 
34010 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61  to adjust the pa
34020 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67  cking of sibling
34030 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65  s to get a bette
34040 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a  r balance..  **.
34050 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74    ** This adjust
34060 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61  ment is more tha
34070 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n an optimizatio
34080 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20  n.  The packing 
34090 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a  above might.  **
340a0 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61   be so out of ba
340b0 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69  lance as to be i
340c0 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61  llegal.  For exa
340d0 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d  mple, the right-
340e0 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e  most.  ** siblin
340f0 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c  g might be compl
34100 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  etely empty.  Th
34110 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
34120 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20   not optional.. 
34130 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b   */.  for(i=k-1;
34140 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
34150 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a  int szRight = sz
34160 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65  New[i];  /* Size
34170 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
34180 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
34190 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e  int szLeft = szN
341a0 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65  ew[i-1]; /* Size
341b0 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
341c0 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69  he left */.    i
341d0 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20  nt r;           
341e0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
341f0 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69  ight-most cell i
34200 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a  n left sibling *
34210 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20  /.    int d;    
34220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
34230 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
34240 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
34250 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f  right sibling */
34260 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77  ..    r = cntNew
34270 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64  [i-1] - 1;.    d
34280 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
34290 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
342a0 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   d<nMaxCells );.
342b0 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d      assert( r<nM
342c0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77  axCells );.    w
342d0 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30  hile( szRight==0
342e0 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 21 62 42   .       || (!bB
342f0 75 6c 6b 20 26 26 20 73 7a 52 69 67 68 74 2b 73  ulk && szRight+s
34300 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65  zCell[d]+2<=szLe
34310 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29  ft-(szCell[r]+2)
34320 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
34330 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c  szRight += szCel
34340 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[d] + 2;.      
34350 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c  szLeft -= szCell
34360 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63  [r] + 2;.      c
34370 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20  ntNew[i-1]--;.  
34380 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
34390 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64  -1] - 1;.      d
343a0 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
343b0 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ata;.    }.    s
343c0 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68  zNew[i] = szRigh
343d0 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31  t;.    szNew[i-1
343e0 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a  ] = szLeft;.  }.
343f0 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20  .  /* Either we 
34400 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  found one or mor
34410 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b  e cells (cntnew[
34420 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20  0])>0) or pPage 
34430 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61  is.  ** a virtua
34440 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20  l root page.  A 
34450 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
34460 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65  e is when the re
34470 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67  al root.  ** pag
34480 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20  e is page 1 and 
34490 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20  we are the only 
344a0 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61  child of that pa
344b0 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 50  ge..  **.  ** UP
344c0 44 41 54 45 3a 20 20 54 68 65 20 61 73 73 65 72  DATE:  The asser
344d0 74 28 29 20 62 65 6c 6f 77 20 69 73 20 6e 6f 74  t() below is not
344e0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74 72 75   necessarily tru
344f0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
34500 65 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 63  e.  ** file is c
34510 6f 72 72 75 70 74 2e 20 20 54 68 65 20 63 6f 72  orrupt.  The cor
34520 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ruption will be 
34530 64 65 74 65 63 74 65 64 20 61 6e 64 20 72 65 70  detected and rep
34540 6f 72 74 65 64 20 6c 61 74 65 72 0a 20 20 2a 2a  orted later.  **
34550 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 64 75   in this procedu
34560 72 65 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  re so there is n
34570 6f 20 6e 65 65 64 20 74 6f 20 61 63 74 20 75 70  o need to act up
34580 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  on it now..  */.
34590 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
345a0 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28  cntNew[0]>0 || (
345b0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31  pParent->pgno==1
345c0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
345d0 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65 6e 64 69 66  ll==0) );.#endif
345e0 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ..  TRACE(("BALA
345f0 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20  NCE: old: %d %d 
34600 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64  %d  ",.    apOld
34610 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  [0]->pgno, .    
34620 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b  nOld>=2 ? apOld[
34630 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20  1]->pgno : 0,.  
34640 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c    nOld>=3 ? apOl
34650 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20  d[2]->pgno : 0. 
34660 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20   ));..  /*.  ** 
34670 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
34680 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
34690 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
346a0 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  sible..  */.  if
346b0 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f  ( apOld[0]->pgno
346c0 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  <=1 ){.    rc = 
346d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
346e0 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  KPT;.    goto ba
346f0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
34700 20 7d 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d   }.  pageFlags =
34710 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61   apOld[0]->aData
34720 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  [0];.  for(i=0; 
34730 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  i<k; i++){.    M
34740 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20  emPage *pNew;.  
34750 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a    if( i<nOld ){.
34760 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e        pNew = apN
34770 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d  ew[i] = apOld[i]
34780 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ;.      apOld[i]
34790 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
347a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
347b0 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  te(pNew->pDbPage
347c0 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  );.      nNew++;
347d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
347e0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
347f0 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  anup;.    }else{
34800 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
34810 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  >0 );.      rc =
34820 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
34830 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
34840 70 67 6e 6f 2c 20 28 62 42 75 6c 6b 20 3f 20 31  pgno, (bBulk ? 1
34850 20 3a 20 70 67 6e 6f 29 2c 20 30 29 3b 0a 20 20   : pgno), 0);.  
34860 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
34870 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
34880 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  p;.      apNew[i
34890 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
348a0 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  nNew++;..      /
348b0 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
348c0 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r-map entry for 
348d0 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
348e0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  page. */.      i
348f0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
34900 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  ){.        ptrma
34910 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e  pPut(pBt, pNew->
34920 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
34930 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
34940 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  o, &rc);.       
34950 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34960 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
34970 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
34980 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  anup;.        }.
34990 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
349a0 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  }..  /* Free any
349b0 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20   old pages that 
349c0 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20  were not reused 
349d0 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  as new pages..  
349e0 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f  */.  while( i<nO
349f0 6c 64 20 29 7b 0a 20 20 20 20 66 72 65 65 50 61  ld ){.    freePa
34a00 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63  ge(apOld[i], &rc
34a10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
34a20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
34a30 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73  anup;.    releas
34a40 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
34a50 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20  .    apOld[i] = 
34a60 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  0;.    i++;.  }.
34a70 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74  .  /*.  ** Put t
34a80 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20  he new pages in 
34a90 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  accending order.
34aa0 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a    This helps to.
34ab0 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65    ** keep entrie
34ac0 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
34ad0 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74  le in order so t
34ae0 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20  hat a scan.  ** 
34af0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
34b00 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
34b10 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20  rough the file. 
34b20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75   That.  ** in tu
34b30 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65  rn helps the ope
34b40 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f  rating system to
34b50 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20   deliver pages. 
34b60 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73   ** from the dis
34b70 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a  k more rapidly..
34b80 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e    **.  ** An O(n
34b90 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f  ^2) insertion so
34ba0 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  rt algorithm is 
34bb0 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a  used, but since.
34bc0 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20    ** n is never 
34bd0 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20  more than NB (a 
34be0 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c  small constant),
34bf0 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a   that should.  *
34c00 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  * not be a probl
34c10 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  em..  **.  ** Wh
34c20 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f  en NB==3, this o
34c30 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ne optimization 
34c40 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61  makes the databa
34c50 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35  se.  ** about 25
34c60 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72  % faster for lar
34c70 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e  ge insertions an
34c80 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a  d deletions..  *
34c90 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  /.  for(i=0; i<k
34ca0 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  -1; i++){.    in
34cb0 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69  t minV = apNew[i
34cc0 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74  ]->pgno;.    int
34cd0 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66   minI = i;.    f
34ce0 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a  or(j=i+1; j<k; j
34cf0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
34d00 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75  pNew[j]->pgno<(u
34d10 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a  nsigned)minV ){.
34d20 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a          minI = j
34d30 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d  ;.        minV =
34d40 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b   apNew[j]->pgno;
34d50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34d60 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b     if( minI>i ){
34d70 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
34d80 70 54 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61  pT;.      pT = a
34d90 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61  pNew[i];.      a
34da0 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b  pNew[i] = apNew[
34db0 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
34dc0 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20  ew[minI] = pT;. 
34dd0 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45     }.  }.  TRACE
34de0 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25  (("new: %d(%d) %
34df0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
34e00 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20  %d) %d(%d)\n",. 
34e10 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e     apNew[0]->pgn
34e20 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20  o, szNew[0],.   
34e30 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77   nNew>=2 ? apNew
34e40 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [1]->pgno : 0, n
34e50 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31  New>=2 ? szNew[1
34e60 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
34e70 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70  =3 ? apNew[2]->p
34e80 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  gno : 0, nNew>=3
34e90 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
34ea0 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61  .    nNew>=4 ? a
34eb0 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[3]->pgno : 
34ec0 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e  0, nNew>=4 ? szN
34ed0 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[3] : 0,.    n
34ee0 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34  New>=5 ? apNew[4
34ef0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
34f00 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20  w>=5 ? szNew[4] 
34f10 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  : 0));..  assert
34f20 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
34f30 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
34f40 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
34f50 20 70 75 74 34 62 79 74 65 28 70 52 69 67 68 74   put4byte(pRight
34f60 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  , apNew[nNew-1]-
34f70 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20  >pgno);..  /*.  
34f80 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69  ** Evenly distri
34f90 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  bute the data in
34fa0 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73   apCell[] across
34fb0 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a   the new pages..
34fc0 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69    ** Insert divi
34fd0 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70  der cells into p
34fe0 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73  Parent as necess
34ff0 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20  ary..  */.  j = 
35000 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
35010 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
35020 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20  /* Assemble the 
35030 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
35040 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
35050 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69   *pNew = apNew[i
35060 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  ];.    assert( j
35070 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
35080 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
35090 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20   pageFlags);.   
350a0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
350b0 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c  ew, cntNew[i]-j,
350c0 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a   &apCell[j], &sz
350d0 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73  Cell[j]);.    as
350e0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c  sert( pNew->nCel
350f0 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20  l>0 || (nNew==1 
35100 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29  && cntNew[0]==0)
35110 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
35120 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  pNew->nOverflow=
35130 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63  =0 );..    j = c
35140 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f  ntNew[i];..    /
35150 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
35160 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20   page assembled 
35170 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68  above was not th
35180 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  e right-most sib
35190 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73  ling,.    ** ins
351a0 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65  ert a divider ce
351b0 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ll into the pare
351c0 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
351d0 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e      assert( i<nN
351e0 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c  ew-1 || j==nCell
351f0 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43   );.    if( j<nC
35200 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ell ){.      u8 
35210 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38  *pCell;.      u8
35220 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69   *pTemp;.      i
35230 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73  nt sz;..      as
35240 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
35250 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  s );.      pCell
35260 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20   = apCell[j];.  
35270 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b      sz = szCell[
35280 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  j] + leafCorrect
35290 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  ion;.      pTemp
352a0 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69   = &aOvflSpace[i
352b0 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20  OvflSpace];.    
352c0 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61    if( !pNew->lea
352d0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  f ){.        mem
352e0 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61  cpy(&pNew->aData
352f0 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a  [8], pCell, 4);.
35300 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
35310 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
35320 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72      /* If the tr
35330 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74  ee is a leaf-dat
35340 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20  a tree, and the 
35350 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61  siblings are lea
35360 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a  ves, .        **
35370 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
35380 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  o divider cell i
35390 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74  n apCell[]. Inst
353a0 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72  ead, the divider
353b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c   .        ** cel
353c0 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  l consists of th
353d0 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  e integer key fo
353e0 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  r the right-most
353f0 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20   cell of .      
35400 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
35410 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20  -page assembled 
35420 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20  above only..    
35430 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43      */.        C
35440 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
35450 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
35460 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
35470 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c  lPtr(pNew, apCel
35480 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  l[j], &info);.  
35490 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
354a0 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20  emp;.        sz 
354b0 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28  = 4 + putVarint(
354c0 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e  &pCell[4], info.
354d0 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70  nKey);.        p
354e0 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Temp = 0;.      
354f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
35500 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20  Cell -= 4;.     
35510 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61     /* Obscure ca
35520 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d  se for non-leaf-
35530 64 61 74 61 20 74 72 65 65 73 3a 20 49 66 20 74  data trees: If t
35540 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c  he cell at pCell
35550 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20   was.        ** 
35560 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65  previously store
35570 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65  d on a leaf node
35580 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74  , and its report
35590 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20  ed size was 4.  
355a0 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20        ** bytes, 
355b0 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75  then it may actu
355c0 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20  ally be smaller 
355d0 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20  than this .     
355e0 20 20 20 2a 2a 20 28 73 65 65 20 62 74 72 65 65     ** (see btree
355f0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
35600 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20 6d  4 bytes is the m
35610 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20  inimum size of. 
35620 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65         ** any ce
35630 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20 69  ll). But it is i
35640 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73  mportant to pass
35650 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a   the correct siz
35660 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a  e to .        **
35670 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73   insertCell(), s
35680 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63 65  o reparse the ce
35690 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20  ll now..        
356a0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f  **.        ** No
356b0 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6e  te that this can
356c0 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e   never happen in
356d0 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20   an SQLite data 
356e0 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20  file, as all.   
356f0 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72       ** cells ar
35700 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  e at least 4 byt
35710 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70  es. It only happ
35720 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75  ens in b-trees u
35730 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  sed.        ** t
35740 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28  o evaluate "IN (
35750 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64  SELECT ...)" and
35760 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73   similar clauses
35770 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
35780 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
35790 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  j]==4 ){.       
357a0 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f     assert(leafCo
357b0 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20  rrection==4);.  
357c0 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
357d0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
357e0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  , pCell);.      
357f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
35800 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20    iOvflSpace += 
35810 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
35820 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f  ( sz<=pBt->maxLo
35830 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20  cal+23 );.      
35840 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61  assert( iOvflSpa
35850 63 65 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  ce <= (int)pBt->
35860 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
35870 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61    insertCell(pPa
35880 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65  rent, nxDiv, pCe
35890 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70  ll, sz, pTemp, p
358a0 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  New->pgno, &rc);
358b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
358c0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
358d0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
358e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
358f0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
35900 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
35910 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
35920 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78     j++;.      nx
35930 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Div++;.    }.  }
35940 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43  .  assert( j==nC
35950 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
35960 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73   nOld>0 );.  ass
35970 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20  ert( nNew>0 );. 
35980 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20   if( (pageFlags 
35990 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29  & PTF_LEAF)==0 )
359a0 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c 64  {.    u8 *zChild
359b0 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d   = &apCopy[nOld-
359c0 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20  1]->aData[8];.  
359d0 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b    memcpy(&apNew[
359e0 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nNew-1]->aData[8
359f0 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20  ], zChild, 4);. 
35a00 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f 6f 74   }..  if( isRoot
35a10 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
35a20 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74  ll==0 && pParent
35a30 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61 70 4e  ->hdrOffset<=apN
35a40 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a  ew[0]->nFree ){.
35a50 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
35a60 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
35a70 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  ee now contains 
35a80 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20 6f 6e  no cells. The on
35a90 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a  ly sibling.    *
35aa0 2a 20 70 61 67 65 20 69 73 20 74 68 65 20 72 69  * page is the ri
35ab0 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65  ght-child of the
35ac0 20 70 61 72 65 6e 74 2e 20 43 6f 70 79 20 74 68   parent. Copy th
35ad0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
35ae0 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 20 70  e.    ** child p
35af0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 72  age into the par
35b00 65 6e 74 2c 20 64 65 63 72 65 61 73 69 6e 67 20  ent, decreasing 
35b10 74 68 65 20 6f 76 65 72 61 6c 6c 20 68 65 69 67  the overall heig
35b20 68 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ht of the.    **
35b30 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
35b40 65 20 62 79 20 6f 6e 65 2e 20 54 68 69 73 20 69  e by one. This i
35b50 73 20 64 65 73 63 72 69 62 65 64 20 61 73 20 74  s described as t
35b60 68 65 20 22 62 61 6c 61 6e 63 65 2d 73 68 61 6c  he "balance-shal
35b70 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20 73 75  lower".    ** su
35b80 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e 20 73  b-algorithm in s
35b90 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  ome documentatio
35ba0 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  n..    **.    **
35bb0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
35bc0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
35bd0 61 73 65 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f  ase, the call to
35be0 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
35bf0 28 29 20 0a 20 20 20 20 2a 2a 20 73 65 74 73 20  () .    ** sets 
35c00 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  all pointer-map 
35c10 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f  entries correspo
35c20 6e 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73  nding to databas
35c30 65 20 69 6d 61 67 65 20 70 61 67 65 73 20 0a 20  e image pages . 
35c40 20 20 20 2a 2a 20 66 6f 72 20 77 68 69 63 68 20     ** for which 
35c50 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73  the pointer is s
35c60 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65  tored within the
35c70 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 63   content being c
35c80 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  opied..    **.  
35c90 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
35ca0 61 73 73 65 72 74 20 62 65 6c 6f 77 20 76 65 72  assert below ver
35cb0 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63  ifies that the c
35cc0 68 69 6c 64 20 70 61 67 65 20 69 73 20 64 65 66  hild page is def
35cd0 72 61 67 6d 65 6e 74 65 64 0a 20 20 20 20 2a 2a  ragmented.    **
35ce0 20 28 69 74 20 6d 75 73 74 20 62 65 2c 20 61 73   (it must be, as
35cf0 20 69 74 20 77 61 73 20 6a 75 73 74 20 72 65 63   it was just rec
35d00 6f 6e 73 74 72 75 63 74 65 64 20 75 73 69 6e 67  onstructed using
35d10 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 29 29   assemblePage())
35d20 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  . This.    ** is
35d30 20 69 6d 70 6f 72 74 61 6e 74 20 69 66 20 74 68   important if th
35d40 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 68 61  e parent page ha
35d50 70 70 65 6e 73 20 74 6f 20 62 65 20 70 61 67 65  ppens to be page
35d60 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
35d70 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67 65 2e  se.    ** image.
35d80 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
35d90 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20 20 20   nNew==1 );.    
35da0 61 73 73 65 72 74 28 20 61 70 4e 65 77 5b 30 5d  assert( apNew[0]
35db0 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20 20 20  ->nFree == .    
35dc0 20 20 20 20 28 67 65 74 32 62 79 74 65 28 26 61      (get2byte(&a
35dd0 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61 5b 35  pNew[0]->aData[5
35de0 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c  ])-apNew[0]->cel
35df0 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b 30 5d  lOffset-apNew[0]
35e00 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20 20 20  ->nCell*2) .    
35e10 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43  );.    copyNodeC
35e20 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c  ontent(apNew[0],
35e30 20 70 50 61 72 65 6e 74 2c 20 26 72 63 29 3b 0a   pParent, &rc);.
35e40 20 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4e      freePage(apN
35e50 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a 20 20 7d  ew[0], &rc);.  }
35e60 65 6c 73 65 20 69 66 28 20 49 53 41 55 54 4f 56  else if( ISAUTOV
35e70 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f 2a 20  ACUUM ){.    /* 
35e80 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Fix the pointer-
35e90 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
35ea0 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20 74 68  all the cells th
35eb0 61 74 20 77 65 72 65 20 73 68 69 66 74 65 64 20  at were shifted 
35ec0 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a 2a 20  around. .    ** 
35ed0 54 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61  There are severa
35ee0 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65  l different type
35ef0 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70  s of pointer-map
35f00 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6e 65   entries that ne
35f10 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
35f20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68  dealt with by th
35f30 69 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f 6d 65  is routine. Some
35f40 20 6f 66 20 74 68 65 73 65 20 68 61 76 65 20 62   of these have b
35f50 65 65 6e 20 73 65 74 20 61 6c 72 65 61 64 79 2c  een set already,
35f60 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61 6e 79   but.    ** many
35f70 20 68 61 76 65 20 6e 6f 74 2e 20 54 68 65 20 66   have not. The f
35f80 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 73 75  ollowing is a su
35f90 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a 20 20  mmary:.    **.  
35fa0 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20 65 6e    **   1) The en
35fb0 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
35fc0 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c 69 6e   with new siblin
35fd0 67 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  g pages that wer
35fe0 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20 20 20  e not.    **    
35ff0 20 20 73 69 62 6c 69 6e 67 73 20 77 68 65 6e 20    siblings when 
36000 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
36010 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 73 65 20  s called. These 
36020 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 20  have already.   
36030 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 73 65   **      been se
36040 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65 65 64  t. We don't need
36050 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74 20   to worry about 
36060 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74 68 61  old siblings tha
36070 74 20 77 65 72 65 0a 20 20 20 20 2a 2a 20 20 20  t were.    **   
36080 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20     moved to the 
36090 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68 65 20  free-list - the 
360a0 66 72 65 65 50 61 67 65 28 29 20 63 6f 64 65 20  freePage() code 
360b0 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65 0a 20  has taken care. 
360c0 20 20 20 2a 2a 20 20 20 20 20 20 6f 66 20 74 68     **      of th
360d0 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ose..    **.    
360e0 2a 2a 20 20 20 32 29 20 54 68 65 20 70 6f 69 6e  **   2) The poin
360f0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
36100 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
36110 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
36120 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 70  ow.    **      p
36130 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65 72 66  age in any overf
36140 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65 64 20  low chains used 
36150 62 79 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  by new divider c
36160 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20 20 20  ells. These .   
36170 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20 61 6c   **      have al
36180 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  so already been 
36190 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20 62 79  taken care of by
361a0 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28   the insertCell(
361b0 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20  ) code..    **. 
361c0 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20 74 68     **   3) If th
361d0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
361e0 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
361f0 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
36200 61 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20 20  ages of.    **  
36210 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72 65 64      cells stored
36220 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e 67 20   on the sibling 
36230 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64 20 74  pages may need t
36240 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
36250 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 34 29    **.    **   4)
36260 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
36270 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 69 6e  pages are not in
36280 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f  ternal intkey no
36290 64 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a 20 20  des, then any.  
362a0 20 20 2a 2a 20 20 20 20 20 20 6f 76 65 72 66 6c    **      overfl
362b0 6f 77 20 70 61 67 65 73 20 75 73 65 64 20 62 79  ow pages used by
362c0 20 74 68 65 73 65 20 63 65 6c 6c 73 20 6d 61 79   these cells may
362d0 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61   need to be upda
362e0 74 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ted.    **      
362f0 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79  (internal intkey
36300 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63 6f 6e   nodes never con
36310 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  tain pointers to
36320 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29   overflow pages)
36330 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
36340 20 20 35 29 20 49 66 20 74 68 65 20 73 69 62 6c    5) If the sibl
36350 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f  ing pages are no
36360 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74  t leaves, then t
36370 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
36380 20 20 20 2a 2a 20 20 20 20 20 20 65 6e 74 72 69     **      entri
36390 65 73 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  es for the right
363a0 2d 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66 20  -child pages of 
363b0 65 61 63 68 20 73 69 62 6c 69 6e 67 20 6d 61 79  each sibling may
363c0 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20 20 20   need.    **    
363d0 20 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e    to be updated.
363e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
363f0 61 73 65 73 20 31 20 61 6e 64 20 32 20 61 72 65  ases 1 and 2 are
36400 20 64 65 61 6c 74 20 77 69 74 68 20 61 62 6f 76   dealt with abov
36410 65 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65 2e  e by other code.
36420 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   The next.    **
36430 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74   block deals wit
36440 68 20 63 61 73 65 73 20 33 20 61 6e 64 20 34 20  h cases 3 and 4 
36450 61 6e 64 20 74 68 65 20 6f 6e 65 20 61 66 74 65  and the one afte
36460 72 20 74 68 61 74 2c 20 63 61 73 65 20 35 2e 20  r that, case 5. 
36470 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73 65 74  Since.    ** set
36480 74 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 6d  ting a pointer m
36490 61 70 20 65 6e 74 72 79 20 69 73 20 61 20 72 65  ap entry is a re
364a0 6c 61 74 69 76 65 6c 79 20 65 78 70 65 6e 73 69  latively expensi
364b0 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68  ve operation, th
364c0 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 6f  is.    ** code o
364d0 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74 65 72  nly sets pointer
364e0 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
364f0 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c   child or overfl
36500 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 68 61  ow pages that ha
36510 76 65 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  ve.    ** actual
36520 6c 79 20 6d 6f 76 65 64 20 62 65 74 77 65 65 6e  ly moved between
36530 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20 20 20   pages.  */.    
36540 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
36550 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20 4d 65  apNew[0];.    Me
36560 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
36570 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69 6e 74  Copy[0];.    int
36580 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c   nOverflow = pOl
36590 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
365a0 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64 20 3d    int iNextOld =
365b0 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e   pOld->nCell + n
365c0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e  Overflow;.    in
365d0 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 6e  t iOverflow = (n
365e0 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d  Overflow ? pOld-
365f0 3e 61 69 4f 76 66 6c 5b 30 5d 20 3a 20 2d 31 29  >aiOvfl[0] : -1)
36600 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20 20 20  ;.    j = 0;    
36610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36620 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
36630 65 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e  ent 'old' siblin
36640 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20  g page */.    k 
36650 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
36660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36670 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e 65 77   /* Current 'new
36680 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a  ' sibling page *
36690 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
366a0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
366b0 20 20 20 20 69 6e 74 20 69 73 44 69 76 69 64 65      int isDivide
366c0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69  r = 0;.      whi
366d0 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20  le( i==iNextOld 
366e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65  ){.        /* Ce
366f0 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c  ll i is the cell
36700 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
36710 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
36720 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20 20  cell on old.    
36730 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70      ** sibling p
36740 61 67 65 20 6a 2e 20 49 66 20 74 68 65 20 73 69  age j. If the si
36750 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
36760 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a  eaf pages of an.
36770 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65          ** intke
36780 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63  y b-tree, then c
36790 65 6c 6c 20 69 20 77 61 73 20 61 20 64 69 76 69  ell i was a divi
367a0 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20  der cell. */.   
367b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 2b 31       assert( j+1
367c0 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 70 43   < ArraySize(apC
367d0 6f 70 79 29 20 29 3b 0a 20 20 20 20 20 20 20 20  opy) );.        
367e0 61 73 73 65 72 74 28 20 6a 2b 31 20 3c 20 6e 4f  assert( j+1 < nO
367f0 6c 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  ld );.        pO
36800 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d  ld = apCopy[++j]
36810 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f  ;.        iNextO
36820 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61  ld = i + !leafDa
36830 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  ta + pOld->nCell
36840 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   + pOld->nOverfl
36850 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ow;.        if( 
36860 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  pOld->nOverflow 
36870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76  ){.          nOv
36880 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e  erflow = pOld->n
36890 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20  Overflow;.      
368a0 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20      iOverflow = 
368b0 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20  i + !leafData + 
368c0 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3b  pOld->aiOvfl[0];
368d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
368e0 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 21     isDivider = !
368f0 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20  leafData;  .    
36900 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
36910 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  t(nOverflow>0 ||
36920 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a   iOverflow<i );.
36930 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76        assert(nOv
36940 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64  erflow<2 || pOld
36950 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d 3d 70 4f 6c  ->aiOvfl[0]==pOl
36960 64 2d 3e 61 69 4f 76 66 6c 5b 31 5d 2d 31 29 3b  d->aiOvfl[1]-1);
36970 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f  .      assert(nO
36980 76 65 72 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c  verflow<3 || pOl
36990 64 2d 3e 61 69 4f 76 66 6c 5b 31 5d 3d 3d 70 4f  d->aiOvfl[1]==pO
369a0 6c 64 2d 3e 61 69 4f 76 66 6c 5b 32 5d 2d 31 29  ld->aiOvfl[2]-1)
369b0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69  ;.      if( i==i
369c0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
369d0 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20      isDivider = 
369e0 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  1;.        if( (
369f0 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29  --nOverflow)>0 )
36a00 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65  {.          iOve
36a10 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20  rflow++;.       
36a20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
36a30 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b    if( i==cntNew[
36a40 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  k] ){.        /*
36a50 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63   Cell i is the c
36a60 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ell immediately 
36a70 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61  following the la
36a80 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20  st cell on new. 
36a90 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e         ** siblin
36aa0 67 20 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65  g page k. If the
36ab0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
36ac0 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20  t leaf pages of 
36ad0 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  an.        ** in
36ae0 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65  tkey b-tree, the
36af0 6e 20 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69  n cell i is a di
36b00 76 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a  vider cell.  */.
36b10 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61          pNew = a
36b20 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20  pNew[++k];.     
36b30 20 20 20 69 66 28 20 21 6c 65 61 66 44 61 74 61     if( !leafData
36b40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
36b50 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
36b60 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20  t( j<nOld );.   
36b70 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65     assert( k<nNe
36b80 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  w );..      /* I
36b90 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f  f the cell was o
36ba0 72 69 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65  riginally divide
36bb0 72 20 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e  r cell (and is n
36bc0 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20  ot now) or.     
36bd0 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   ** an overflow 
36be0 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20  cell, or if the 
36bf0 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64  cell was located
36c00 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
36c10 73 69 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  sibling.      **
36c20 20 70 61 67 65 20 62 65 66 6f 72 65 20 74 68 65   page before the
36c30 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e   balancing, then
36c40 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
36c50 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
36c60 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  ted.      ** wit
36c70 68 20 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f  h any child or o
36c80 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65  verflow pages ne
36c90 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
36ca0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
36cb0 69 73 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c  isDivider || pOl
36cc0 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70  d->pgno!=pNew->p
36cd0 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69  gno ){.        i
36ce0 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69  f( !leafCorrecti
36cf0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  on ){.          
36d00 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67  ptrmapPut(pBt, g
36d10 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69  et4byte(apCell[i
36d20 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ]), PTRMAP_BTREE
36d30 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72  , pNew->pgno, &r
36d40 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
36d50 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
36d60 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63  [i]>pNew->minLoc
36d70 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
36d80 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
36d90 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d  (pNew, apCell[i]
36da0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
36db0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
36dc0 0a 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f  .    if( !leafCo
36dd0 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  rrection ){.    
36de0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
36df0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  w; i++){.       
36e00 20 75 33 32 20 6b 65 79 20 3d 20 67 65 74 34 62   u32 key = get4b
36e10 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61  yte(&apNew[i]->a
36e20 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
36e30 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
36e40 20 6b 65 79 2c 20 50 54 52 4d 41 50 5f 42 54 52   key, PTRMAP_BTR
36e50 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67  EE, apNew[i]->pg
36e60 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
36e70 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20  }.    }..#if 0. 
36e80 20 20 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70     /* The ptrmap
36e90 43 68 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e  CheckPages() con
36ea0 74 61 69 6e 73 20 61 73 73 65 72 74 28 29 20 73  tains assert() s
36eb0 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76  tatements that v
36ec0 65 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a  erify that.    *
36ed0 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61  * all pointer ma
36ee0 70 20 70 61 67 65 73 20 61 72 65 20 73 65 74 20  p pages are set 
36ef0 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20  correctly. This 
36f00 69 73 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65  is helpful while
36f10 20 0a 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69   .    ** debuggi
36f20 6e 67 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  ng. This is usua
36f30 6c 6c 79 20 64 69 73 61 62 6c 65 64 20 62 65 63  lly disabled bec
36f40 61 75 73 65 20 61 20 63 6f 72 72 75 70 74 20 64  ause a corrupt d
36f50 61 74 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20  atabase may.    
36f60 2a 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73 65  ** cause an asse
36f70 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74  rt() statement t
36f80 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20  o fail.  */.    
36f90 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
36fa0 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20  (apNew, nNew);. 
36fb0 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61     ptrmapCheckPa
36fc0 67 65 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29  ges(&pParent, 1)
36fd0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
36fe0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
36ff0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41  >isInit );.  TRA
37000 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69  CE(("BALANCE: fi
37010 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e  nished: old=%d n
37020 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e  ew=%d cells=%d\n
37030 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c  ",.          nOl
37040 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29  d, nNew, nCell))
37050 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65  ;..  /*.  ** Cle
37060 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75  anup before retu
37070 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61  rning..  */.bala
37080 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73  nce_cleanup:.  s
37090 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
370a0 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72  e(apCell);.  for
370b0 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
370c0 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
370d0 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
370e0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
370f0 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
37100 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65  releasePage(apNe
37110 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  w[i]);.  }..  re
37120 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 69 66 20 64  turn rc;.}.#if d
37130 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
37140 20 26 26 20 5f 4d 53 43 5f 56 45 52 20 3e 3d 20   && _MSC_VER >= 
37150 31 37 30 30 20 26 26 20 64 65 66 69 6e 65 64 28  1700 && defined(
37160 5f 4d 5f 41 52 4d 29 0a 23 70 72 61 67 6d 61 20  _M_ARM).#pragma 
37170 6f 70 74 69 6d 69 7a 65 28 22 22 2c 20 6f 6e 29  optimize("", on)
37180 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
37190 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
371a0 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
371b0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
371c0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
371d0 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20   is.** overfull 
371e0 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  (has one or more
371f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29   overflow pages)
37200 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68  ..**.** A new ch
37210 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  ild page is allo
37220 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 63 6f  cated and the co
37230 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 75  ntents of the cu
37240 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61  rrent root.** pa
37250 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76  ge, including ov
37260 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72  erflow cells, ar
37270 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  e copied into th
37280 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f  e child. The roo
37290 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65  t.** page is the
372a0 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20 74 6f  n overwritten to
372b0 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d 70 74   make it an empt
372c0 79 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20  y page with the 
372d0 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20  right-child .** 
372e0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67  pointer pointing
372f0 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
37300 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
37310 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f  eturning, all po
37320 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
37330 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  s corresponding 
37340 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74 68 61  to pages .** tha
37350 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 2d  t the new child-
37360 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  page now contain
37370 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 72  s pointers to ar
37380 65 20 75 70 64 61 74 65 64 2e 20 54 68 65 0a 2a  e updated. The.*
37390 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73 70 6f  * entry correspo
373a0 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77  nding to the new
373b0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69   right-child poi
373c0 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74  nter of the root
373d0 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c 73 6f  .** page is also
373e0 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
373f0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
37400 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20 74  ppChild is set t
37410 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 66 65  o contain a refe
37420 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 68 69  rence to the chi
37430 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20  ld .** page and 
37440 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
37450 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  urned. In this c
37460 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 69  ase the caller i
37470 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
37480 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67   call releasePag
37490 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20  e() on *ppChild 
374a0 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66  exactly once. If
374b0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
374c0 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  ,.** an error co
374d0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
374e0 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73  nd *ppChild is s
374f0 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74  et to 0..*/.stat
37500 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  ic int balance_d
37510 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  eeper(MemPage *p
37520 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  Root, MemPage **
37530 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20  ppChild){.  int 
37540 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
37550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
37560 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
37570 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f  subprocedures */
37580 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69  .  MemPage *pChi
37590 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ld = 0;         
375a0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
375b0 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
375c0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43   */.  Pgno pgnoC
375d0 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20  hild = 0;       
375e0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
375f0 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ber of the new c
37600 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42  hild page */.  B
37610 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
37620 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a  Root->pBt;    /*
37630 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20   The BTree */.. 
37640 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
37650 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20  nOverflow>0 );. 
37660 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
37670 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
37680 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
37690 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65   Make pRoot, the
376a0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
376b0 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74 61 62  e b-tree, writab
376c0 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  le. Allocate a n
376d0 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20 74 68  ew .  ** page th
376e0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
376f0 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69  he new right-chi
37700 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43 6f 70  ld of pPage. Cop
37710 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20  y the contents. 
37720 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65 20   ** of the node 
37730 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20  stored on pRoot 
37740 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63 68 69  into the new chi
37750 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ld page..  */.  
37760 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
37770 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
37780 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
37790 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
377a0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
377b0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 26 70  BtreePage(pBt,&p
377c0 43 68 69 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64  Child,&pgnoChild
377d0 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b  ,pRoot->pgno,0);
377e0 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e  .    copyNodeCon
377f0 74 65 6e 74 28 70 52 6f 6f 74 2c 20 70 43 68 69  tent(pRoot, pChi
37800 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  ld, &rc);.    if
37810 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
37820 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
37830 74 28 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64  t(pBt, pgnoChild
37840 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
37850 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  pRoot->pgno, &rc
37860 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
37870 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 70  f( rc ){.    *pp
37880 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72  Child = 0;.    r
37890 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
378a0 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  d);.    return r
378b0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
378c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
378d0 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d  riteable(pChild-
378e0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
378f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
37900 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
37910 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29  Root->pDbPage) )
37920 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69  ;.  assert( pChi
37930 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74  ld->nCell==pRoot
37940 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52  ->nCell );..  TR
37950 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
37960 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f  opy root %d into
37970 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70   %d\n", pRoot->p
37980 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e  gno, pChild->pgn
37990 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20  o));..  /* Copy 
379a0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
379b0 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f  ls from pRoot to
379c0 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d   pChild */.  mem
379d0 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 69 4f 76  cpy(pChild->aiOv
379e0 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 69 4f 76 66  fl, pRoot->aiOvf
379f0 6c 2c 0a 20 20 20 20 20 20 20 20 20 70 52 6f 6f  l,.         pRoo
37a00 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a  t->nOverflow*siz
37a10 65 6f 66 28 70 52 6f 6f 74 2d 3e 61 69 4f 76 66  eof(pRoot->aiOvf
37a20 6c 5b 30 5d 29 29 3b 0a 20 20 6d 65 6d 63 70 79  l[0]));.  memcpy
37a30 28 70 43 68 69 6c 64 2d 3e 61 70 4f 76 66 6c 2c  (pChild->apOvfl,
37a40 20 70 52 6f 6f 74 2d 3e 61 70 4f 76 66 6c 2c 0a   pRoot->apOvfl,.
37a50 20 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e           pRoot->
37a60 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66  nOverflow*sizeof
37a70 28 70 52 6f 6f 74 2d 3e 61 70 4f 76 66 6c 5b 30  (pRoot->apOvfl[0
37a80 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e  ]));.  pChild->n
37a90 4f 76 65 72 66 6c 6f 77 20 3d 20 70 52 6f 6f 74  Overflow = pRoot
37aa0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 0a 20 20  ->nOverflow;..  
37ab0 2f 2a 20 5a 65 72 6f 20 74 68 65 20 63 6f 6e 74  /* Zero the cont
37ac0 65 6e 74 73 20 6f 66 20 70 52 6f 6f 74 2e 20 54  ents of pRoot. T
37ad0 68 65 6e 20 69 6e 73 74 61 6c 6c 20 70 43 68 69  hen install pChi
37ae0 6c 64 20 61 73 20 74 68 65 20 72 69 67 68 74 2d  ld as the right-
37af0 63 68 69 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f  child. */.  zero
37b00 50 61 67 65 28 70 52 6f 6f 74 2c 20 70 43 68 69  Page(pRoot, pChi
37b10 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e  ld->aData[0] & ~
37b20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74  PTF_LEAF);.  put
37b30 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
37b40 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
37b50 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69  fset+8], pgnoChi
37b60 6c 64 29 3b 0a 0a 20 20 2a 70 70 43 68 69 6c 64  ld);..  *ppChild
37b70 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 72 65 74   = pChild;.  ret
37b80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
37b90 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
37ba0 20 74 68 61 74 20 70 43 75 72 20 63 75 72 72 65   that pCur curre
37bb0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 68  ntly points to h
37bc0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64  as just been mod
37bd0 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65  ified in.** some
37be0 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e 63 74   way. This funct
37bf0 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75 74 20  ion figures out 
37c00 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69 63 61  if this modifica
37c10 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a  tion means the.*
37c20 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20  * tree needs to 
37c30 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64  be balanced, and
37c40 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74 68 65   if so calls the
37c50 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c   appropriate bal
37c60 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69  ancing .** routi
37c70 6e 65 2e 20 42 61 6c 61 6e 63 69 6e 67 20 72 6f  ne. Balancing ro
37c80 75 74 69 6e 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a  utines are:.**.*
37c90 2a 20 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  *   balance_quic
37ca0 6b 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65  k().**   balance
37cb0 5f 64 65 65 70 65 72 28 29 0a 2a 2a 20 20 20 62  _deeper().**   b
37cc0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
37cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
37ce0 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72 20  alance(BtCursor 
37cf0 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
37d00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
37d10 63 6f 6e 73 74 20 69 6e 74 20 6e 4d 69 6e 20 3d  const int nMin =
37d20 20 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62   pCur->pBt->usab
37d30 6c 65 53 69 7a 65 20 2a 20 32 20 2f 20 33 3b 0a  leSize * 2 / 3;.
37d40 20 20 75 38 20 61 42 61 6c 61 6e 63 65 51 75 69    u8 aBalanceQui
37d50 63 6b 53 70 61 63 65 5b 31 33 5d 3b 0a 20 20 75  ckSpace[13];.  u
37d60 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20  8 *pFree = 0;.. 
37d70 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62   TESTONLY( int b
37d80 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c  alance_quick_cal
37d90 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 54 45 53  led = 0 );.  TES
37da0 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e  TONLY( int balan
37db0 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64  ce_deeper_called
37dc0 20 3d 20 30 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a   = 0 );..  do {.
37dd0 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
37de0 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
37df0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
37e00 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  = pCur->apPage[i
37e10 50 61 67 65 5d 3b 0a 0a 20 20 20 20 69 66 28 20  Page];..    if( 
37e20 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
37e30 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
37e40 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
37e50 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
37e60 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
37e70 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e   is overfull. In
37e80 20 74 68 69 73 20 63 61 73 65 20 63 61 6c 6c 20   this case call 
37e90 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  the.        ** b
37ea0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20  alance_deeper() 
37eb0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 72 65 61  function to crea
37ec0 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20 66  te a new child f
37ed0 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
37ee0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
37ef0 63 6f 70 79 20 74 68 65 20 63 75 72 72 65 6e 74  copy the current
37f00 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
37f10 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 69 74   root-page to it
37f20 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
37f30 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
37f40 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77  of the do-loop w
37f50 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ill balance the 
37f60 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20  child page..    
37f70 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20      */ .        
37f80 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65  assert( (balance
37f90 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 2b 2b  _deeper_called++
37fa0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
37fb0 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65  rc = balance_dee
37fc0 70 65 72 28 70 50 61 67 65 2c 20 26 70 43 75 72  per(pPage, &pCur
37fd0 2d 3e 61 70 50 61 67 65 5b 31 5d 29 3b 0a 20 20  ->apPage[1]);.  
37fe0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
37ff0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
38000 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65       pCur->iPage
38010 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
38020 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
38030 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43   0;.          pC
38040 75 72 2d 3e 61 69 49 64 78 5b 31 5d 20 3d 20 30  ur->aiIdx[1] = 0
38050 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
38060 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
38070 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  [1]->nOverflow )
38080 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
38090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
380a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
380b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
380c0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
380d0 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65  0 && pPage->nFre
380e0 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20 20 20 20 20  e<=nMin ){.     
380f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
38100 65 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  e{.      MemPage
38110 20 2a 20 63 6f 6e 73 74 20 70 50 61 72 65 6e 74   * const pParent
38120 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
38130 69 50 61 67 65 2d 31 5d 3b 0a 20 20 20 20 20 20  iPage-1];.      
38140 69 6e 74 20 63 6f 6e 73 74 20 69 49 64 78 20 3d  int const iIdx =
38150 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61   pCur->aiIdx[iPa
38160 67 65 2d 31 5d 3b 0a 0a 20 20 20 20 20 20 72 63  ge-1];..      rc
38170 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
38180 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  rite(pParent->pD
38190 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
381a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
381b0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
381c0 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
381d0 4e 43 45 0a 20 20 20 20 20 20 20 20 69 66 28 20  NCE.        if( 
381e0 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 0a 20  pPage->hasData. 
381f0 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
38200 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 0a 20  ->nOverflow==1. 
38210 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
38220 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d 3d 70 50 61  ->aiOvfl[0]==pPa
38230 67 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20  ge->nCell.      
38240 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70     && pParent->p
38250 67 6e 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20  gno!=1.         
38260 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  && pParent->nCel
38270 6c 3d 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20  l==iIdx.        
38280 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
38290 43 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69  Call balance_qui
382a0 63 6b 28 29 20 74 6f 20 63 72 65 61 74 65 20 61  ck() to create a
382b0 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20   new sibling of 
382c0 70 50 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20  pPage on which. 
382d0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73           ** to s
382e0 74 6f 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  tore the overflo
382f0 77 20 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f  w cell. balance_
38300 71 75 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20  quick() inserts 
38310 61 20 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20  a new cell.     
38320 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61       ** into pPa
38330 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20  rent, which may 
38340 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76  cause pParent ov
38350 65 72 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a  erflow. If this.
38360 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70            ** hap
38370 70 65 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69  pens, the next i
38380 6e 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  nteration of the
38390 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61   do-loop will ba
383a0 6c 61 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20  lance pParent . 
383b0 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20           ** use 
383c0 65 69 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e  either balance_n
383d0 6f 6e 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61  onroot() or bala
383e0 6e 63 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e  nce_deeper(). Un
383f0 74 69 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20  til this.       
38400 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74     ** happens, t
38410 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
38420 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
38430 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  e aBalanceQuickS
38440 70 61 63 65