/ Hex Artifact Content
Login

Artifact 2521a74f04cf288497af3b318fa3a31efb272ef6:


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: 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
2140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2150: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2160: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2170: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
2180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2190: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
21a0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
21b0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
21c0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
21d0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
21e0: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
21f0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2200: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2210: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2220: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2230: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2240: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2250: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2260: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2270: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
2280: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
2290: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
22a0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
22b0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
22c0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
22d0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
22e0: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
22f0: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2300: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2310: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2320: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2330: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2340: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2350: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2360: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2370: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2380: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
2390: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
23a0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
23b0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
23c0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
23d0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
23e0: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
23f0: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2400: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2410: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2420: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2430: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2440: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2450: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2460: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2470: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
2480: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
2490: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
24a0: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 73 50 65         pBt->isPe
24b0: 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  nding = 1;.     
24c0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
24d0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
24e0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d  AREDCACHE;.    }
24f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2500: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2510: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
2520: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
2530: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2540: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2550: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  CHE./*.** Add a 
2560: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
2570: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2580: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
2590: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
25a0: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
25b0: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
25c0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
25d0: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
25e0: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
25f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  K..**.** This fu
2600: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
2610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2620: 0a 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70  .**   (a) The sp
2630: 65 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62  ecified Btree ob
2640: 6a 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63  ject p is connec
2650: 74 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c  ted to a sharabl
2660: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
2670: 61 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68  ase (one with th
2680: 65 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61  e BtShared.shara
2690: 62 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61  ble flag set), a
26a0: 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e  nd.**.**   (b) N
26b0: 6f 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  o other Btree ob
26c0: 6a 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63  jects hold a loc
26d0: 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  k that conflicts
26e0: 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74  .**       with t
26f0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
2700: 6b 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61  k (i.e. querySha
2710: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2720: 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20  k() has.**      
2730: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2740: 6c 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65  lled and returne
2750: 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a  d SQLITE_OK)..**
2760: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2770: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2780: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
2790: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
27a0: 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73  ITE_NOMEM .** is
27b0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
27c0: 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61  alloc attempt fa
27d0: 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
27e0: 6e 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68  nt setSharedCach
27f0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
2800: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
2810: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
2820: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2830: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
2840: 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  *pLock = 0;.  Bt
2850: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
2860: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2870: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2880: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2890: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
28a0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
28b0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
28c0: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20  ( p->db!=0 );.. 
28d0: 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e   /* A connection
28e0: 20 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75   with the read-u
28f0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
2900: 73 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74  set will never t
2910: 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69  ry to.  ** obtai
2920: 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73  n a read-lock us
2930: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
2940: 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64  n. The only read
2950: 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20  -lock obtained. 
2960: 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74   ** by a connect
2970: 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f  ion in read-unco
2980: 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20  mmitted mode is 
2990: 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  on the sqlite_ma
29a0: 73 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65  ster .  ** table
29b0: 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20  , and that lock 
29c0: 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42  is obtained in B
29d0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29  treeBeginTrans()
29e0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29f0: 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  0==(p->db->flags
2a00: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
2a10: 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65 4c 6f 63  mmitted) || eLoc
2a20: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2a30: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2a40: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
2a50: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   be called on a 
2a60: 73 68 61 72 61 62 6c 65 20 62 2d 74 72 65 65 20  sharable b-tree 
2a70: 61 66 74 65 72 20 69 74 20 0a 20 20 2a 2a 20 68  after it .  ** h
2a80: 61 73 20 62 65 65 6e 20 64 65 74 65 72 6d 69 6e  as been determin
2a90: 65 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ed that no other
2aa0: 20 62 2d 74 72 65 65 20 68 6f 6c 64 73 20 61 20   b-tree holds a 
2ab0: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b  conflicting lock
2ac0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2ad0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 3b 0a 20  p->sharable );. 
2ae0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
2af0: 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72 65 64 43  OK==querySharedC
2b00: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
2b10: 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20   iTable, eLock) 
2b20: 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73  );..  /* First s
2b30: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
2b40: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
2b50: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
2b60: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
2b70: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
2b80: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
2b90: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2ba0: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
2bb0: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
2bc0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
2bd0: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
2be0: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
2bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2c00: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
2c10: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
2c20: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
2c30: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
2c40: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
2c50: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
2c60: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
2c70: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
2c80: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
2c90: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
2ca0: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
2cb0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
2cc0: 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  ro(sizeof(BtLock
2cd0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
2ce0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
2cf0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
2d10: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
2d20: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
2d30: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
2d40: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
2d50: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
2d60: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
2d70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2d80: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
2d90: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
2da0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
2db0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
2dc0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
2dd0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
2de0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
2df0: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
2e00: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
2e10: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
2e20: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
2e30: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
2e40: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
2e50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
2e60: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
2e70: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
2e80: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
2e90: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
2ea0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
2eb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ec0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2ed0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2ee0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2ef0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f00: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2f10: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
2f20: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
2f30: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
2f40: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
2f50: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
2f60: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
2f70: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
2f80: 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  y Btree object p
2f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2fa0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2fb0: 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61  at Btree p has a
2fc0: 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  n open read or w
2fd0: 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  rite .** transac
2fe0: 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73  tion. If it does
2ff0: 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42   not, then the B
3000: 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e  tShared.isPendin
3010: 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  g variable.** ma
3020: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3030: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3040: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3050: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3060: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3070: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3080: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3090: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
30a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
30b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
30c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
30d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
30e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
30f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3100: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3110: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3120: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3130: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3140: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3150: 72 74 28 20 70 42 74 2d 3e 69 73 45 78 63 6c 75  rt( pBt->isExclu
3160: 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  sive==0 || pBt->
3170: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
3180: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
3190: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
31a0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
31b0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
31c0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
31d0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
31e0: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
31f0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3200: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3210: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3220: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3230: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3240: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3250: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3260: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
3270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3280: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
3290: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
32a0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42   }..  assert( pB
32b0: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20  t->isPending==0 
32c0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20  || pBt->pWriter 
32d0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  );.  if( pBt->pW
32e0: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
32f0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
3300: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63  ;.    pBt->isExc
3310: 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20  lusive = 0;.    
3320: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
3330: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
3340: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3350: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
3360: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
3380: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
3390: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
33a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
33b0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
33c0: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
33d0: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
33e0: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
33f0: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3400: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3410: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3420: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3430: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3440: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3450: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
3460: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
3470: 20 74 68 65 20 69 73 50 65 6e 64 69 6e 67 20 66   the isPending f
3480: 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  lag to 0..    **
3490: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
34a0: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
34b0: 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e  y a writer, then
34c0: 20 42 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64   BtShared.isPend
34d0: 69 6e 67 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ing must.    ** 
34e0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
34f0: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3500: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3510: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3520: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 73 50   */.    pBt->isP
3530: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a  ending = 0;.  }.
3540: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3550: 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61  nction changes a
3560: 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68  ll write-locks h
3570: 65 6c 64 20 62 79 20 42 74 72 65 65 20 70 20 69  eld by Btree p i
3580: 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a  nto read-locks..
3590: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
35a0: 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
35b0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
35c0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
35d0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
35e0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d  >pBt;.  if( pBt-
35f0: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3600: 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b     BtLock *pLock
3610: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  ;.    pBt->pWrit
3620: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3630: 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30  >isExclusive = 0
3640: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  ;.    pBt->isPen
3650: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ding = 0;.    fo
3660: 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f  r(pLock=pBt->pLo
3670: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
3680: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
3690: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
36a0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ock->eLock==READ
36b0: 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e  _LOCK || pLock->
36c0: 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20  pBtree==p );.   
36d0: 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20     pLock->eLock 
36e0: 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
36f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66   }.  }.}..#endif
3700: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
3710: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
3730: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
3740: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
3750: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
3760: 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69  */../*.***** Thi
3770: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3780: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
3790: 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a  rt() only ****.*
37a0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
37b0: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
37c0: 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69  s the mutex on i
37d0: 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23  ts BtShared.*/.#
37e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
37f0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  UG.static int cu
3800: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42  rsorHoldsMutex(B
3810: 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72  tCursor *p){.  r
3820: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
3830: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
3840: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
3850: 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
3860: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
3870: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3880: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
3890: 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66  age-list cache f
38a0: 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20  or cursor pCur, 
38b0: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69  if any..*/.stati
38c0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
38d0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  eOverflowCache(B
38e0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
38f0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
3900: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
3910: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
3920: 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
3930: 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76  ow);.  pCur->aOv
3940: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f  erflow = 0;.}../
3950: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
3960: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
3970: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
3980: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
3990: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  ned.** on the sh
39a0: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
39b0: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61  ture pBt..*/.sta
39c0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
39d0: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
39e0: 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  che(BtShared *pB
39f0: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
3a00: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
3a10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3a20: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3a30: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
3a40: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
3a50: 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  xt){.    invalid
3a60: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3a70: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
3a80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3a90: 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
3aa0: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
3ab0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62  ontents of a tab
3ac0: 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64  le.** to invalid
3ad0: 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
3ae0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
3af0: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a  e open on the.**
3b00: 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74   row or one of t
3b10: 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f  he rows being mo
3b20: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  dified..**.** If
3b30: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3b40: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
3b50: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
3b60: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
3b70: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
3b80: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
3b90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
3ba0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
3bb0: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
3bc0: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
3bd0: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
3be0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
3bf0: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
3c00: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
3c10: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
3c20: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
3c30: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
3c40: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
3c50: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
3c60: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
3c70: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
3c80: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
3c90: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
3ca0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74  ors open on that
3cb0: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
3cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3cd0: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3ce0: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
3cf0: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
3d00: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3d10: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
3d20: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20   */.  i64 iRow, 
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d40: 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
3d50: 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
3d60: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65  g */.  int isCle
3d70: 61 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f  arTable        /
3d80: 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f  * True if all ro
3d90: 77 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c  ws are being del
3da0: 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  eted */.){.  BtC
3db0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68  ursor *p;.  BtSh
3dc0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72  ared *pBt = pBtr
3dd0: 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ee->pBt;.  asser
3de0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
3df0: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
3e00: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3e10: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3e20: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3e30: 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  f( p->isIncrblob
3e40: 48 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65  Handle && (isCle
3e50: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
3e60: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
3e70: 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74  {.      p->eStat
3e80: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
3e90: 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ID;.    }.  }.}.
3ea0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62  .#else.  /* Stub
3eb0: 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20   functions when 
3ec0: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
3ed0: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
3ee0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3ef0: 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64  lowCache(x).  #d
3f00: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
3f10: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f20: 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  (x).  #define in
3f30: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3f40: 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23  Cursors(x,y,z).#
3f50: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3f60: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
3f70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
3f80: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
3f90: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
3fa0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
3fb0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
3fc0: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
3fd0: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
3fe0: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
3ff0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4000: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
4010: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
4020: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
4030: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
4040: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
4050: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
4060: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
4070: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
4080: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
4090: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
40a0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
40b0: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
40c0: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
40d0: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
40e0: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
40f0: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
4100: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
4110: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
4120: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
4130: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
4140: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
4150: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4160: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
4170: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
4180: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
4190: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
41a0: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
41b0: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
41c0: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
41d0: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
41e0: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
41f0: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
4200: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
4210: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4220: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
4230: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
4240: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
4250: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
4260: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
4270: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
4280: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
4290: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
42a0: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
42b0: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
42c0: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
42d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
42e0: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
42f0: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
4300: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
4310: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
4320: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
4330: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
4340: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
4350: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4360: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
4370: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
4380: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
4390: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
43a0: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
43b0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
43c0: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
43d0: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
43e0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
43f0: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
4400: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
4410: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
4420: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4430: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
4440: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
4450: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
4460: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
4470: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
4480: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
4490: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
44a0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
44b0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
44c0: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
44d0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
44e0: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
44f0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4500: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
4510: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
4520: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
4530: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
4540: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
4550: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
4560: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
4570: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
4580: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
4590: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
45a0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
45b0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
45c0: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74   2 above is omit
45d0: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
45e0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
45f0: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
4600: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
4610: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
4620: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
4630: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
4640: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
4650: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
4660: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4670: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
4680: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4690: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
46a0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
46b0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
46c0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
46d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
46e0: 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a  <=pBt->nPage );.
46f0: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
4700: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
4710: 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e  tvecCreate(pBt->
4720: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4730: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4740: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
4750: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4760: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
4770: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
4780: 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76  gno<=sqlite3Bitv
4790: 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73  ecSize(pBt->pHas
47a0: 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20  Content) ){.    
47b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
47c0: 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43  ecSet(pBt->pHasC
47d0: 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  ontent, pgno);. 
47e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
47f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  }../*.** Query t
4800: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4810: 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a  Content vector..
4820: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4830: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
4840: 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  en a free-list l
4850: 65 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f  eaf page is remo
4860: 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ved from the.** 
4870: 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65  free-list for re
4880: 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20  use. It returns 
4890: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
48a0: 61 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20  afe to retrieve 
48b0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d  the.** page from
48c0: 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
48d0: 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
48e0: 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
48f0: 20 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e   True otherwise.
4900: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4910: 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
4920: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4930: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42   Pgno pgno){.  B
4940: 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e  itvec *p = pBt->
4950: 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72  pHasContent;.  r
4960: 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e  eturn (p && (pgn
4970: 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  o>sqlite3BitvecS
4980: 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65  ize(p) || sqlite
4990: 33 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70  3BitvecTest(p, p
49a0: 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gno)));.}../*.**
49b0: 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29   Clear (destroy)
49c0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
49d0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
49e0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
49f0: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74  .** invoked at t
4a00: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
4a10: 20 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e   each write-tran
4a20: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
4a30: 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65  ic void btreeCle
4a40: 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  arHasContent(BtS
4a50: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
4a60: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
4a70: 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  roy(pBt->pHasCon
4a80: 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48  tent);.  pBt->pH
4a90: 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d  asContent = 0;.}
4aa0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
4ab0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
4ac0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
4ad0: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
4ae0: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
4af0: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
4b00: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
4b10: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
4b20: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
4b30: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4b40: 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
4b50: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
4b60: 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74  valid (has eStat
4b70: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
4b80: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
4b90: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
4ba0: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.  .*/.static i
4bb0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
4bc0: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
4bd0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
4be0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
4bf0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
4c00: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
4c10: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
4c20: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
4c30: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
4c40: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
4c50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4c60: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
4c70: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ->nKey);.  asser
4c80: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
4c90: 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28   );  /* KeySize(
4ca0: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  ) cannot fail */
4cb0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
4cc0: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
4cd0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
4ce0: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
4cf0: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
4d00: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
4d10: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
4d20: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
4d30: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
4d40: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
4d50: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
4d60: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
4d70: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
4d80: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
4d90: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
4da0: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
4db0: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
4dc0: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
4dd0: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
4de0: 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70   if( 0==pCur->ap
4df0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
4e00: 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  ){.    void *pKe
4e10: 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
4e20: 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  c( (int)pCur->nK
4e30: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
4e40: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
4e50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4e60: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
4e70: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
4e80: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
4e90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4ea0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
4eb0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
4ec0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4ed0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
4ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
4ef0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
4f00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4f10: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
4f20: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
4f30: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
4f40: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
4f50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4f60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4f70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
4f80: 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
4f90: 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
4fa0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4fb0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72  [i]);.      pCur
4fc0: 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
4fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
4fe0: 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20  >iPage = -1;.   
4ff0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5000: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5010: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c  EK;.  }..  inval
5020: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5030: 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  he(pCur);.  retu
5040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5050: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5060: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5070: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5080: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5090: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
50a0: 20 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65    with root-page
50b0: 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c   iRoot. Usually,
50c0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
50d0: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
50e0: 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73  or.** pExcept is
50f0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
5100: 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65  the table (Btree
5110: 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
5120: 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73  eInsert())..*/.s
5130: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
5140: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
5150: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
5160: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
5170: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
5180: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
5190: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
51a0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
51b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
51c0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
51d0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
51e0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
51f0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
5200: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
5210: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5220: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5230: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20  Root==iRoot) && 
5240: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
5250: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5260: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
5270: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
5280: 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
5290: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
52a0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
52b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
52c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
52d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
52e0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
52f0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5300: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5310: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5320: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5330: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5340: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5350: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5360: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5370: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5380: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5390: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
53a0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
53b0: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
53c0: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
53d0: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
53e0: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
53f0: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5400: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5410: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5420: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5430: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5440: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5450: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5460: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5470: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5480: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5490: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
54a0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
54b0: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
54c0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
54d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
54e0: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
54f0: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5500: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5510: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5520: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5530: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5540: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5550: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5560: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5570: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5580: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5590: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
55a0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
55b0: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
55c0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
55d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55f0: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5600: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5610: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5620: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5630: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5640: 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20  pace[150];      
5650: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5660: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5670: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5680: 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72  c */.  char *pFr
5690: 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  ee = 0;..  if( p
56a0: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
56b0: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
56c0: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
56d0: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
56e0: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
56f0: 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20  dRecord(.       
5700: 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c   pCur->pKeyInfo,
5710: 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
5720: 61 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a  aSpace), &pFree.
5730: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70      );.    if( p
5740: 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75  IdxKey==0 ) retu
5750: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5760: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
5770: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
5780: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
5790: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49  t)nKey, pKey, pI
57a0: 64 78 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  dxKey);.  }else{
57b0: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
57c0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
57d0: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
57e0: 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
57f0: 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
5800: 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
5810: 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  pFree ){.    sql
5820: 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d  ite3DbFree(pCur-
5830: 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70  >pKeyInfo->db, p
5840: 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Free);.  }.  ret
5850: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5860: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
5870: 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74  sor to the posit
5880: 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f  ion it was in (o
5890: 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73  r as close to as
58a0: 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68   possible).** wh
58b0: 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  en saveCursorPos
58c0: 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c  ition() was call
58d0: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
58e0: 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20  is call deletes 
58f0: 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f  the .** saved po
5900: 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72  sition info stor
5910: 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72  ed by saveCursor
5920: 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74  Position(), so t
5930: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61  here can be.** a
5940: 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63  t most one effec
5950: 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73  tive restoreCurs
5960: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
5970: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
5980: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
5990: 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ion()..*/.static
59a0: 20 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72   int btreeRestor
59b0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
59c0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
59d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
59e0: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
59f0: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5a00: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
5a10: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
5a20: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
5a30: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
5a40: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
5a50: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
5a60: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
5a70: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
5a80: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
5a90: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
5aa0: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
5ab0: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
5ac0: 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70  , 0, &pCur->skip
5ad0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
5ae0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5af0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5b00: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
5b10: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
5b20: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
5b30: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
5b40: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
5b50: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
5b60: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20  NVALID );.  }.  
5b70: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
5b80: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72  efine restoreCur
5b90: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
5ba0: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
5bb0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5bc0: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62  K ? \.         b
5bd0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
5be0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c  rPosition(p) : \
5bf0: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
5c00: 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  _OK)../*.** Dete
5c10: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
5c20: 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61   not a cursor ha
5c30: 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  s moved from the
5c40: 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20   position it.** 
5c50: 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20  was last placed 
5c60: 61 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e  at.  Cursors can
5c70: 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72   move when the r
5c80: 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  ow they are poin
5c90: 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65  ting.** at is de
5ca0: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
5cb0: 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  nder them..**.**
5cc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
5cd0: 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63  turns an error c
5ce0: 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ode if something
5cf0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68   goes wrong.  Th
5d00: 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48  e.** integer *pH
5d10: 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  asMoved is set t
5d20: 6f 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72  o one if the cur
5d30: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e  sor has moved an
5d40: 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69  d 0 if not..*/.i
5d50: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
5d60: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74  ursorHasMoved(Bt
5d70: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
5d80: 74 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20  t *pHasMoved){. 
5d90: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
5da0: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
5db0: 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
5dc0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
5dd0: 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20  HasMoved = 1;.  
5de0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
5df0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
5e00: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
5e10: 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e  D || pCur->skipN
5e20: 65 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70  ext!=0 ){.    *p
5e30: 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20  HasMoved = 1;.  
5e40: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73  }else{.    *pHas
5e50: 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  Moved = 0;.  }. 
5e60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5e70: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
5e80: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
5e90: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  CUUM./*.** Given
5ea0: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   a page number o
5eb0: 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61  f a regular data
5ec0: 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72  base page, retur
5ed0: 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  n the page.** nu
5ee0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69  mber for the poi
5ef0: 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68  nter-map page th
5f00: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
5f10: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a  entry for the.**
5f20: 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62   input page numb
5f30: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
5f40: 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20   0 (not a valid 
5f50: 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d  page) for pgno==
5f60: 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  1 since there is
5f70: 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d  .** no pointer m
5f80: 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ap associated wi
5f90: 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20  th page 1.  The 
5fa0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
5fb0: 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65  logic.** require
5fc0: 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67  s that ptrmapPag
5fd0: 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a  eno(*,1)!=1..*/.
5fe0: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
5ff0: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
6000: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
6010: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
6020: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67  PerMapPage;.  Pg
6030: 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  no iPtrMap, ret;
6040: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6050: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
6060: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
6070: 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75  f( pgno<2 ) retu
6080: 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65  rn 0;.  nPagesPe
6090: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
60a0: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
60b0: 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70  ;.  iPtrMap = (p
60c0: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
60d0: 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d  MapPage;.  ret =
60e0: 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73   (iPtrMap*nPages
60f0: 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b  PerMapPage) + 2;
6100: 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e   .  if( ret==PEN
6110: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
6120: 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b  Bt) ){.    ret++
6130: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6140: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
6150: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
6160: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
6170: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6180: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
6190: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
61a0: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
61b0: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
61c0: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
61d0: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
61e0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
61f0: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a  er 'pgno'..**.**
6200: 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74   If *pRC is init
6210: 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28  ially non-zero (
6220: 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74  non-SQLITE_OK) t
6230: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
6240: 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20   is.** a no-op. 
6250: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
6260: 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72  urs, the appropr
6270: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
6280: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
6290: 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74  to *pRC..*/.stat
62a0: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
62b0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
62c0: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54   Pgno key, u8 eT
62d0: 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74  ype, Pgno parent
62e0: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44  , int *pRC){.  D
62f0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
6300: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
6310: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  map page */.  u8
6320: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
6330: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
6340: 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e  ap data */.  Pgn
6350: 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f  o iPtrmap;     /
6360: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6370: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  p page number */
6380: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
6390: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
63a0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
63b0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
63c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
63d0: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
63e0: 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  bfunctions */.. 
63f0: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
6400: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rn;..  assert( s
6410: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6420: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
6430: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
6440: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
6450: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
6460: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
6470: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
6480: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
6490: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
64a0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
64b0: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
64c0: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
64d0: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
64e0: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  key==0 ){.    *p
64f0: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
6500: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
6510: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72  turn;.  }.  iPtr
6520: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
6530: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
6540: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6550: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
6560: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
6570: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
6580: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6590: 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
65a0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f   return;.  }.  o
65b0: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
65c0: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
65d0: 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66  , key);.  if( of
65e0: 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70  fset<0 ){.    *p
65f0: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
6600: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
6610: 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a  to ptrmap_exit;.
6620: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
6630: 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74  fset <= (int)pBt
6640: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29  ->usableSize-5 )
6650: 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  ;.  pPtrmap = (u
6660: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
6670: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
6680: 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  ;..  if( eType!=
6690: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
66a0: 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74  || get4byte(&pPt
66b0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21  rmap[offset+1])!
66c0: 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54  =parent ){.    T
66d0: 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50  RACE(("PTRMAP_UP
66e0: 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64  DATE: %d->(%d,%d
66f0: 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65  )\n", key, eType
6700: 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20  , parent));.    
6710: 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74  *pRC= rc = sqlit
6720: 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
6730: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
6740: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6750: 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66        pPtrmap[of
6760: 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20  fset] = eType;. 
6770: 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
6780: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
6790: 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d  , parent);.    }
67a0: 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69  .  }..ptrmap_exi
67b0: 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t:.  sqlite3Page
67c0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
67d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
67e0: 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  n entry from the
67f0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
6800: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6810: 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70   retrieves the p
6820: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
6830: 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c   for page 'key',
6840: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
6850: 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20  type and parent 
6860: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a  page number to *
6870: 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e  pEType and *pPgn
6880: 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  o respectively..
6890: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
68a0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
68b0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
68c0: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
68d0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
68e0: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47  atic int ptrmapG
68f0: 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  et(BtShared *pBt
6900: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a  , Pgno key, u8 *
6910: 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50  pEType, Pgno *pP
6920: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
6930: 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  pDbPage;   /* Th
6940: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
6950: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72  ge */.  int iPtr
6960: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
6970: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69  inter map page i
6980: 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50  ndex */.  u8 *pP
6990: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
69a0: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
69b0: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f   data */.  int o
69c0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
69d0: 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79   Offset of entry
69e0: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
69f0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
6a00: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6a10: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
6a20: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74  mutex) );..  iPt
6a30: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
6a40: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
6a50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
6a60: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
6a70: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
6a80: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
6a90: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
6aa0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72  n rc;.  }.  pPtr
6ab0: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6ac0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6ad0: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66  pDbPage);..  off
6ae0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
6af0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
6b00: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
6b10: 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  et<0 ){.    sqli
6b20: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
6b30: 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  bPage);.    retu
6b40: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6b50: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
6b60: 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20  sert( offset <= 
6b70: 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
6b80: 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65  Size-5 );.  asse
6b90: 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b  rt( pEType!=0 );
6ba0: 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74  .  *pEType = pPt
6bb0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  rmap[offset];.  
6bc0: 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67  if( pPgno ) *pPg
6bd0: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
6be0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
6bf0: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  );..  sqlite3Pag
6c00: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
6c10: 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c  ;.  if( *pEType<
6c20: 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29  1 || *pEType>5 )
6c30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
6c40: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72  ORRUPT_BKPT;.  r
6c50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6c60: 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  .}..#else /* if 
6c70: 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f  defined SQLITE_O
6c80: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
6c90: 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  /.  #define ptrm
6ca0: 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63  apPut(w,x,y,z,rc
6cb0: 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  ).  #define ptrm
6cc0: 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53  apGet(w,x,y,z) S
6cd0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
6ce0: 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  ne ptrmapPutOvfl
6cf0: 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65  Ptr(x, y, rc).#e
6d00: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ndif../*.** Give
6d10: 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61  n a btree page a
6d20: 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20  nd a cell index 
6d30: 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72  (0 means the fir
6d40: 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68  st cell on.** th
6d50: 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20  e page, 1 means 
6d60: 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c  the second cell,
6d70: 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72   and so forth) r
6d80: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
6d90: 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  ** to the cell c
6da0: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ontent..**.** Th
6db0: 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
6dc0: 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20   only for pages 
6dd0: 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74  that do not cont
6de0: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
6df0: 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66  ls..*/.#define f
6e00: 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20  indCell(P,I) \. 
6e10: 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28   ((P)->aData + (
6e20: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
6e30: 67 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61  get2byte(&(P)->a
6e40: 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29  CellIdx[2*(I)]))
6e50: 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  ).#define findCe
6e60: 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44  llv2(D,M,O,I) (D
6e70: 2b 28 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28  +(M&get2byte(D+(
6e80: 4f 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a  O+2*(I))))).../*
6e90: 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20  .** This a more 
6ea0: 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20  complex version 
6eb0: 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68  of findCell() th
6ec0: 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20  at works for.** 
6ed0: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f  pages that do co
6ee0: 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ntain overflow c
6ef0: 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ells..*/.static 
6f00: 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77  u8 *findOverflow
6f10: 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
6f20: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
6f30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
6f40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6f50: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
6f60: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
6f70: 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65  or(i=pPage->nOve
6f80: 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69  rflow-1; i>=0; i
6f90: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a  --){.    int k;.
6fa0: 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c      struct _Ovfl
6fb0: 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20  Cell *pOvfl;.   
6fc0: 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d   pOvfl = &pPage-
6fd0: 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b  >aOvfl[i];.    k
6fe0: 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20   = pOvfl->idx;. 
6ff0: 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20     if( k<=iCell 
7000: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  ){.      if( k==
7010: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  iCell ){.       
7020: 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70   return pOvfl->p
7030: 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cell;.      }.  
7040: 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20      iCell--;.   
7050: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7060: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
7070: 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iCell);.}../*.**
7080: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
7090: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
70a0: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
70b0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  Info structure. 
70c0: 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77   There.** are tw
70d0: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
70e0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74  is function.  bt
70f0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
7100: 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20  akes a .** cell 
7110: 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63  index as the sec
7120: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  ond argument and
7130: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7140: 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61  tr() .** takes a
7150: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7160: 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  body of the cell
7170: 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61   as its second a
7180: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  rgument..**.** W
7190: 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c  ithin this file,
71a0: 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29   the parseCell()
71b0: 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61   macro can be ca
71c0: 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  lled instead of.
71d0: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
71e0: 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f  lPtr(). Using so
71f0: 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68  me compilers, th
7200: 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65  is will be faste
7210: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
7220: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
7230: 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Ptr(.  MemPage *
7240: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
7250: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
7260: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
7270: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
7280: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
7290: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
72a0: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
72b0: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
72c0: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
72d0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
72e0: 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20  {.  u16 n;      
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7300: 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63  umber bytes in c
7310: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64  ell content head
7320: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  er */.  u32 nPay
7330: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
7340: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
7350: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
7360: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
7370: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7380: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
7390: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e  mutex) );..  pIn
73a0: 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c  fo->pCell = pCel
73b0: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  l;.  assert( pPa
73c0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
73d0: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
73e0: 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68  .  n = pPage->ch
73f0: 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73  ildPtrSize;.  as
7400: 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61  sert( n==4-4*pPa
7410: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66  ge->leaf );.  if
7420: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
7430: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
7440: 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
7450: 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e     n += getVarin
7460: 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e  t32(&pCell[n], n
7470: 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65  Payload);.    }e
7480: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c  lse{.      nPayl
7490: 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  oad = 0;.    }. 
74a0: 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e     n += getVarin
74b0: 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36  t(&pCell[n], (u6
74c0: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
74d0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61  ;.    pInfo->nDa
74e0: 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ta = nPayload;. 
74f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66   }else{.    pInf
7500: 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20  o->nData = 0;.  
7510: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7520: 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50  32(&pCell[n], nP
7530: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e  ayload);.    pIn
7540: 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c  fo->nKey = nPayl
7550: 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  oad;.  }.  pInfo
7560: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61  ->nPayload = nPa
7570: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
7580: 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74  nHeader = n;.  t
7590: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
75a0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
75b0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
75c0: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
75d0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
75e0: 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50  .  if( likely(nP
75f0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
7600: 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20  axLocal) ){.    
7610: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
7620: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
7630: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
7640: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
7650: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
7660: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
7670: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
7680: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
7690: 66 28 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f( (pInfo->nSize
76a0: 20 3d 20 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c   = (u16)(n+nPayl
76b0: 6f 61 64 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d  oad))<4 ) pInfo-
76c0: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
76d0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
76e0: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
76f0: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
7700: 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  low = 0;.  }else
7710: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
7720: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
7730: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
7740: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
7750: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a  e, we have.    *
7760: 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20  * to decide how 
7770: 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f  much to store lo
7780: 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75  cally and how mu
7790: 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f  ch to spill onto
77a0: 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  .    ** overflow
77b0: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
77c0: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
77d0: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
77e0: 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a  of unused.    **
77f0: 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c   space on overfl
7800: 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b  ow pages while k
7810: 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e  eeping the amoun
7820: 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61  t of local stora
7830: 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74  ge.    ** in bet
7840: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
7850: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20  d maxLocal..    
7860: 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e  **.    ** Warnin
7870: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
7880: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
7890: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
78a0: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20  uted in any.    
78b0: 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75  ** way will resu
78c0: 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  lt in an incompa
78d0: 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61  tible file forma
78e0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  t..    */.    in
78f0: 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t minLocal;  /* 
7900: 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Minimum amount o
7910: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
7920: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
7930: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
7940: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
7950: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
7960: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e  ocally */.    in
7970: 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20  t surplus;   /* 
7980: 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  Overflow payload
7990: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c   available for l
79a0: 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a  ocal storage */.
79b0: 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  .    minLocal = 
79c0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
79d0: 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20  .    maxLocal = 
79e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  pPage->maxLocal;
79f0: 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  .    surplus = m
7a00: 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c  inLocal + (nPayl
7a10: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
7a20: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
7a30: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
7a40: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
7a50: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b  lus==maxLocal );
7a60: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73  .    testcase( s
7a70: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
7a80: 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75  +1 );.    if( su
7a90: 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61  rplus <= maxLoca
7aa0: 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f  l ){.      pInfo
7ab0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
7ac0: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
7ad0: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
7ae0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d  >nLocal = (u16)m
7af0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
7b00: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
7b10: 6c 6f 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66  low = (u16)(pInf
7b20: 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a  o->nLocal + n);.
7b30: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
7b40: 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66   = pInfo->iOverf
7b50: 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23  low + 4;.  }.}.#
7b60: 64 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c  define parseCell
7b70: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70  (pPage, iCell, p
7b80: 49 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50  Info) \.  btreeP
7b90: 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61  arseCellPtr((pPa
7ba0: 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70  ge), findCell((p
7bb0: 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c  Page), (iCell)),
7bc0: 20 28 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63   (pInfo)).static
7bd0: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
7be0: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
7bf0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
7c00: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
7c10: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
7c20: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
7c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7c40: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
7c50: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
7c60: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
7c70: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
7c80: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
7c90: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73  ure */.){.  pars
7ca0: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  eCell(pPage, iCe
7cb0: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f  ll, pInfo);.}../
7cc0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
7cd0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
7ce0: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
7cf0: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
7d00: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
7d10: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
7d20: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
7d30: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
7d40: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
7d50: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
7d60: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
7d70: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
7d80: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
7d90: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
7da0: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
7db0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  er..*/.static u1
7dc0: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
7dd0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
7de0: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
7df0: 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70  pIter = &pCell[p
7e00: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
7e10: 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65  ze];.  u32 nSize
7e20: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
7e30: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
7e40: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
7e50: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
7e60: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
7e70: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
7e80: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
7e90: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
7ea0: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
7eb0: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
7ec0: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
7ed0: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
7ee0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
7ef0: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
7f00: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
7f10: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
7f20: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
7f30: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
7f40: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
7f50: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
7f60: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7f70: 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
7f80: 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e  &debuginfo);.#en
7f90: 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65  dif..  if( pPage
7fa0: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
7fb0: 75 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66  u8 *pEnd;.    if
7fc0: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
7fd0: 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20   ){.      pIter 
7fe0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
7ff0: 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20  Iter, nSize);.  
8000: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
8010: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Size = 0;.    }.
8020: 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f  .    /* pIter no
8030: 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  w points at the 
8040: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b  64-bit integer k
8050: 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69  ey value, a vari
8060: 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20  able length .   
8070: 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65   ** integer. The
8080: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
8090: 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20   moves pIter to 
80a0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72  point at the fir
80b0: 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70  st byte.    ** p
80c0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
80d0: 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f  he key value. */
80e0: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
80f0: 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  er[9];.    while
8100: 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38  ( (*pIter++)&0x8
8110: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
8120: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8130: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
8140: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a  nt32(pIter, nSiz
8150: 65 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63  e);.  }..  testc
8160: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
8170: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
8180: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
8190: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
81a0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
81b0: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
81c0: 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69  al ){.    int mi
81d0: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
81e0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53  minLocal;.    nS
81f0: 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  ize = minLocal +
8200: 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63   (nSize - minLoc
8210: 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  al) % (pPage->pB
8220: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
8230: 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
8240: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
8250: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  maxLocal );.    
8260: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
8270: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
8280: 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  +1 );.    if( nS
8290: 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ize>pPage->maxLo
82a0: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69  cal ){.      nSi
82b0: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  ze = minLocal;. 
82c0: 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b     }.    nSize +
82d0: 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65  = 4;.  }.  nSize
82e0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
82f0: 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20  - pCell);..  /* 
8300: 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65  The minimum size
8310: 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20   of any cell is 
8320: 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66  4 bytes. */.  if
8330: 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20  ( nSize<4 ){.   
8340: 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a   nSize = 4;.  }.
8350: 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65  .  assert( nSize
8360: 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a  ==debuginfo.nSiz
8370: 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  e );.  return (u
8380: 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66  16)nSize;.}..#if
8390: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
83a0: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
83b0: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
83c0: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
83d0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
83e0: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
83f0: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
8400: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
8410: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
8420: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63  ell){.  return c
8430: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
8440: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
8450: 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e  , iCell));.}.#en
8460: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
8470: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
8480: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
8490: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
84a0: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
84b0: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
84c0: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
84d0: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
84e0: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
84f0: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
8500: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
8510: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
8520: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
8530: 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67  utOvflPtr(MemPag
8540: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
8550: 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ell, int *pRC){.
8560: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
8570: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
8580: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
8590: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74  pCell!=0 );.  bt
85a0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
85b0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
85c0: 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
85d0: 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61  (info.nData+(pPa
85e0: 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66  ge->intKey?0:inf
85f0: 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e  o.nKey))==info.n
8600: 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28  Payload );.  if(
8610: 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
8620: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
8630: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
8640: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
8650: 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  w]);.    ptrmapP
8660: 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f  ut(pPage->pBt, o
8670: 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
8680: 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
8690: 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a  no, pRC);.  }.}.
86a0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
86b0: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
86c0: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
86d0: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
86e0: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
86f0: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
8700: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
8710: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
8720: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
8730: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
8740: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
8750: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
8760: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
8770: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
8780: 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69  t area..*/.stati
8790: 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74  c int defragment
87a0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
87b0: 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
87e0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8800: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
8810: 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a   a i-th cell */.
8820: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8840: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61  Offset to the pa
8850: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
8860: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
8870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
8880: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20  e of a cell */. 
8890: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
88b0: 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20  umber of usable 
88c0: 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20  bytes on a page 
88d0: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
88e0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
88f0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
8900: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
8910: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72  ray */.  int cbr
8920: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
8930: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
8940: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
8950: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
8960: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
8970: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8980: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
8990: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
89a0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20  ned char *data; 
89b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
89c0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69  e data */.  unsi
89d0: 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b  gned char *temp;
89e0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61         /* Temp a
89f0: 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e  rea for cell con
8a00: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43  tent */.  int iC
8a10: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20  ellFirst;       
8a20: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c       /* First al
8a30: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64  lowable cell ind
8a40: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ex */.  int iCel
8a50: 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  lLast;          
8a60: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
8a70: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
8a80: 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  /...  assert( sq
8a90: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
8aa0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
8ab0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
8ac0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
8ad0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8ae0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
8af0: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
8b00: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
8b10: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8b20: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
8b30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8b40: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
8b50: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
8b60: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c   );.  temp = sql
8b70: 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
8b80: 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  ce(pPage->pBt->p
8b90: 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d  Pager);.  data =
8ba0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
8bb0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
8bc0: 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f  rOffset;.  cellO
8bd0: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
8be0: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65  ellOffset;.  nCe
8bf0: 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
8c00: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  l;.  assert( nCe
8c10: 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  ll==get2byte(&da
8c20: 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20  ta[hdr+3]) );.  
8c30: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
8c40: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8c50: 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65  ize;.  cbrk = ge
8c60: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
8c70: 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  +5]);.  memcpy(&
8c80: 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74  temp[cbrk], &dat
8c90: 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53  a[cbrk], usableS
8ca0: 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63  ize - cbrk);.  c
8cb0: 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  brk = usableSize
8cc0: 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d  ;.  iCellFirst =
8cd0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
8ce0: 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61  nCell;.  iCellLa
8cf0: 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  st = usableSize 
8d00: 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  - 4;.  for(i=0; 
8d10: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
8d20: 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20     u8 *pAddr;   
8d30: 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65    /* The i-th ce
8d40: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
8d50: 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b    pAddr = &data[
8d60: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32  cellOffset + i*2
8d70: 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  ];.    pc = get2
8d80: 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20  byte(pAddr);.   
8d90: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
8da0: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
8db0: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
8dc0: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20  CellLast );.#if 
8dd0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8de0: 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f  ENABLE_OVERSIZE_
8df0: 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20  CELL_CHECK).    
8e00: 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69  /* These conditi
8e10: 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ons have already
8e20: 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69   been verified i
8e30: 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  n btreeInitPage(
8e40: 29 0a 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49  ).    ** if SQLI
8e50: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
8e60: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73  ZE_CELL_CHECK is
8e70: 20 64 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f   defined .    */
8e80: 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c  .    if( pc<iCel
8e90: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
8ea0: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
8eb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8ec0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
8ed0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  }.#endif.    ass
8ee0: 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69  ert( pc>=iCellFi
8ef0: 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c  rst && pc<=iCell
8f00: 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65  Last );.    size
8f10: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
8f20: 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29  Page, &temp[pc])
8f30: 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69  ;.    cbrk -= si
8f40: 7a 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ze;.#if defined(
8f50: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
8f60: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
8f70: 4b 29 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c  K).    if( cbrk<
8f80: 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20  iCellFirst ){.  
8f90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8fa0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8fb0: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
8fc0: 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69  if( cbrk<iCellFi
8fd0: 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  rst || pc+size>u
8fe0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
8ff0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9000: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9010: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
9020: 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a  assert( cbrk+siz
9030: 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26  e<=usableSize &&
9040: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
9050: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
9060: 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73  e( cbrk+size==us
9070: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
9080: 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a  testcase( pc+siz
9090: 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e==usableSize );
90a0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
90b0: 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70  a[cbrk], &temp[p
90c0: 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70  c], size);.    p
90d0: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63  ut2byte(pAddr, c
90e0: 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  brk);.  }.  asse
90f0: 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46  rt( cbrk>=iCellF
9100: 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79  irst );.  put2by
9110: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
9120: 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68   cbrk);.  data[h
9130: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
9140: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
9150: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
9160: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
9170: 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20  iCellFirst], 0, 
9180: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29  cbrk-iCellFirst)
9190: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
91a0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
91b0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
91c0: 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72  ge) );.  if( cbr
91d0: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50  k-iCellFirst!=pP
91e0: 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
91f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9200: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9210: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
9220: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
9230: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
9240: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f  tes of space fro
9250: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54  m within the B-T
9260: 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a  ree page passed.
9270: 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
9280: 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20  argument. Write 
9290: 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69  into *pIdx the i
92a0: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
92b0: 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74  >aData[].** of t
92c0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
92d0: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
92e0: 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20  . Return either 
92f0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20  SQLITE_OK or.** 
9300: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75  an error code (u
9310: 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f  sually SQLITE_CO
9320: 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  RRUPT)..**.** Th
9330: 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74  e caller guarant
9340: 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ees that there i
9350: 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  s sufficient spa
9360: 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ce to make the.*
9370: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54  * allocation.  T
9380: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
9390: 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67  t need to defrag
93a0: 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  ment in order to
93b0: 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68   bring.** all th
93c0: 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72  e space together
93d0: 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73  , however.  This
93e0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76   routine will av
93f0: 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65  oid using.** the
9400: 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73   first two bytes
9410: 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70   past the cell p
9420: 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63  ointer area sinc
9430: 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69  e presumably thi
9440: 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  s.** allocation 
9450: 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e  is being made in
9460: 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74   order to insert
9470: 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20   a new cell, so 
9480: 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  we will.** also 
9490: 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61  end up needing a
94a0: 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
94b0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
94c0: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
94d0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
94e0: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
94f0: 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  Idx){.  const in
9500: 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
9510: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  drOffset;    /* 
9520: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
9530: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
9540: 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
9550: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
9560: 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ata;      /* Loc
9570: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
9580: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e  e->aData */.  in
9590: 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20  t nFrag;        
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
95c0: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
95d0: 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69   on pPage */.  i
95e0: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9600: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
9610: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
9620: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
9630: 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  gap;        /* F
9640: 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70  irst byte of gap
9650: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f   between cell po
9660: 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20  inters and cell 
9670: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
9680: 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   rc;         /* 
9690: 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63  Integer return c
96a0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ode */.  int usa
96b0: 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62  bleSize; /* Usab
96c0: 6c 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  le size of the p
96d0: 61 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  age */.  .  asse
96e0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
96f0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
9700: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
9710: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9720: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
9730: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9740: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9750: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9760: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
9770: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
9780: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
9790: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
97a0: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
97b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
97c0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
97d0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
97e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
97f0: 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
9800: 20 6e 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53   nByte < usableS
9810: 69 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61  ize-8 );..  nFra
9820: 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b  g = data[hdr+7];
9830: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9840: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20  ->cellOffset == 
9850: 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61  hdr + 12 - 4*pPa
9860: 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61  ge->leaf );.  ga
9870: 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  p = pPage->cellO
9880: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
9890: 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20  >nCell;.  top = 
98a0: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
98b0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
98c0: 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72   if( gap>top ) r
98d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
98e0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73  RUPT_BKPT;.  tes
98f0: 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f  tcase( gap+2==to
9900: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
9910: 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20   gap+1==top );. 
9920: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d   testcase( gap==
9930: 74 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46  top );..  if( nF
9940: 72 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f  rag>=60 ){.    /
9950: 2a 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d  * Always defragm
9960: 65 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d  ent highly fragm
9970: 65 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20  ented pages */. 
9980: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
9990: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
99a0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
99b0: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
99c0: 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f   get2byteNotZero
99d0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
99e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b    }else if( gap+
99f0: 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  2<=top ){.    /*
9a00: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
9a10: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
9a20: 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67   a free slot big
9a30: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
9a40: 66 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  fy .    ** the r
9a50: 65 71 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f  equest. The allo
9a60: 63 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66  cation is made f
9a70: 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 66 72  rom the first fr
9a80: 65 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20  ee slot in .    
9a90: 2a 2a 20 74 68 65 20 6c 69 73 74 20 74 68 61 74  ** the list that
9aa0: 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
9ab0: 20 74 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69   to accomadate i
9ac0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  t..    */.    in
9ad0: 74 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20  t pc, addr;.    
9ae0: 66 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20  for(addr=hdr+1; 
9af0: 28 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26  (pc = get2byte(&
9b00: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20  data[addr]))>0; 
9b10: 61 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20  addr=pc){.      
9b20: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
9b30: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9b40: 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f  the free slot */
9b50: 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73  .      if( pc>us
9b60: 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63  ableSize-4 || pc
9b70: 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20  <addr+4 ){.     
9b80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9b90: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9ba0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a       }.      siz
9bb0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
9bc0: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
9bd0: 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65   if( size>=nByte
9be0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
9bf0: 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  x = size - nByte
9c00: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
9c10: 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20  se( x==4 );.    
9c20: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
9c30: 3d 33 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =3 );.        if
9c40: 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ( x<4 ){.       
9c50: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
9c60: 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66   slot from the f
9c70: 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65  ree-list. Update
9c80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
9c90: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67           ** frag
9ca0: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74  mented bytes wit
9cb0: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f  hin the page. */
9cc0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
9cd0: 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26  y(&data[addr], &
9ce0: 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20  data[pc], 2);.  
9cf0: 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72          data[hdr
9d00: 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67  +7] = (u8)(nFrag
9d10: 20 2b 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d   + x);.        }
9d20: 65 6c 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63  else if( size+pc
9d30: 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b   > usableSize ){
9d40: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
9d50: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9d60: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
9d70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
9d80: 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61  /* The slot rema
9d90: 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ins on the free-
9da0: 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73  list. Reduce its
9db0: 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74   size to account
9dc0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  .          ** fo
9dd0: 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73  r the portion us
9de0: 65 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c  ed by the new al
9df0: 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  location. */.   
9e00: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
9e10: 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b  &data[pc+2], x);
9e20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9e30: 20 20 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20     *pIdx = pc + 
9e40: 78 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  x;.        retur
9e50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
9e60: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
9e70: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    /* Check to ma
9e80: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
9e90: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e   enough space in
9ea0: 20 74 68 65 20 67 61 70 20 74 6f 20 73 61 74 69   the gap to sati
9eb0: 73 66 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c  sfy.  ** the all
9ec0: 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74  ocation.  If not
9ed0: 2c 20 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20  , defragment..  
9ee0: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
9ef0: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
9f00: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
9f10: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
9f20: 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
9f30: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
9f40: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
9f50: 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  rc;.    top = ge
9f60: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
9f70: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20  ata[hdr+5]);.   
9f80: 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79   assert( gap+nBy
9f90: 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a  te<=top );.  }..
9fa0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
9fb0: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
9fc0: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
9fd0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
9fe0: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
9ff0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
a000: 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49  rea.  The btreeI
a010: 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68  nitPage() call h
a020: 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  as already.  ** 
a030: 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72  validated the fr
a040: 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74  eelist.  Given t
a050: 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74  hat the freelist
a060: 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65   is valid, there
a070: 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20  .  ** is no way 
a080: 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74  that the allocat
a090: 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f  ion can extend o
a0a0: 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
a0b0: 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65  e page..  ** The
a0c0: 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20   assert() below 
a0d0: 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65  verifies the pre
a0e0: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a  vious sentence..
a0f0: 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42    */.  top -= nB
a100: 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28  yte;.  put2byte(
a110: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
a120: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  p);.  assert( to
a130: 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29  p+nByte <= (int)
a140: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a150: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64  leSize );.  *pId
a160: 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72  x = top;.  retur
a170: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
a180: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
a190: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
a1a0: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
a1b0: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
a1c0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
a1d0: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
a1e0: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
a1f0: 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e  isk[start].** an
a200: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
a210: 65 20 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65  e block is "size
a220: 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d  " bytes..**.** M
a230: 6f 73 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72  ost of the effor
a240: 74 20 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76  t here is involv
a250: 65 64 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20  ed in coalesing 
a260: 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65  adjacent.** free
a270: 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73   blocks into a s
a280: 69 6e 67 6c 65 20 62 69 67 20 66 72 65 65 20 62  ingle big free b
a290: 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
a2a0: 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d 65  int freeSpace(Me
a2b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
a2c0: 74 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a  t start, int siz
a2d0: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
a2e0: 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69  pbegin, hdr;.  i
a2f0: 6e 74 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20  nt iLast;       
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73   /* Largest poss
a320: 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f  ible freeblock o
a330: 66 66 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67  ffset */.  unsig
a340: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
a350: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a   pPage->aData;..
a360: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a370: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
a380: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
a390: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
a3a0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
a3b0: 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74 3e    assert( start>
a3c0: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
a3d0: 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64  t+6+pPage->child
a3e0: 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  PtrSize );.  ass
a3f0: 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73 69  ert( (start + si
a400: 7a 65 29 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  ze) <= (int)pPag
a410: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a420: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
a430: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
a440: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
a450: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
a460: 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20  t( size>=0 );   
a470: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
a480: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 20 20  size is 4 */..  
a490: 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
a4a0: 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a  secureDelete ){.
a4b0: 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65      /* Overwrite
a4c0: 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
a4d0: 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20  tion with zeros 
a4e0: 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f  when the secure_
a4f0: 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70  delete.    ** op
a500: 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
a510: 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  */.    memset(&d
a520: 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73  ata[start], 0, s
a530: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
a540: 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62 61  Add the space ba
a550: 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ck into the link
a560: 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  ed list of freeb
a570: 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61  locks.  Note tha
a580: 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75  t.  ** even thou
a590: 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  gh the freeblock
a5a0: 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65   list was checke
a5b0: 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61  d by btreeInitPa
a5c0: 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65 65  ge(),.  ** btree
a5d0: 49 6e 69 74 50 61 67 65 28 29 20 64 69 64 20 6e  InitPage() did n
a5e0: 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61  ot detect overla
a5f0: 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20  pping cells or. 
a600: 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20 74   ** freeblocks t
a610: 68 61 74 20 6f 76 65 72 6c 61 70 70 65 64 20 63  hat overlapped c
a620: 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73  ells.   Nor does
a630: 20 69 74 20 64 65 74 65 63 74 20 77 68 65 6e 20   it detect when 
a640: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f  the.  ** cell co
a650: 6e 74 65 6e 74 20 61 72 65 61 20 65 78 63 65 65  ntent area excee
a660: 64 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  ds the value in 
a670: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2e  the page header.
a680: 20 20 49 66 20 74 68 65 73 65 0a 20 20 2a 2a 20    If these.  ** 
a690: 73 69 74 75 61 74 69 6f 6e 73 20 61 72 69 73 65  situations arise
a6a0: 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e  , then subsequen
a6b0: 74 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  t insert operati
a6c0: 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72 72 75 70  ons might corrup
a6d0: 74 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c  t.  ** the freel
a6e0: 69 73 74 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e  ist.  So we do n
a6f0: 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72  eed to check for
a700: 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 68 69 6c   corruption whil
a710: 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20  e scanning.  ** 
a720: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20  the freelist..  
a730: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
a740: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61  ->hdrOffset;.  a
a750: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
a760: 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e   iLast = pPage->
a770: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
a780: 2d 20 34 3b 0a 20 20 61 73 73 65 72 74 28 20 73  - 4;.  assert( s
a790: 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20  tart<=iLast );. 
a7a0: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
a7b0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a7c0: 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26  [addr]))<start &
a7d0: 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20  & pbegin>0 ){.  
a7e0: 20 20 69 66 28 20 70 62 65 67 69 6e 3c 61 64 64    if( pbegin<add
a7f0: 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74  r+4 ){.      ret
a800: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
a810: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
a820: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
a830: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 62 65 67  ;.  }.  if( pbeg
a840: 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20 20  in>iLast ){.    
a850: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a860: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
a870: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
a880: 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d  >addr || pbegin=
a890: 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  =0 );.  put2byte
a8a0: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74  (&data[addr], st
a8b0: 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65  art);.  put2byte
a8c0: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70  (&data[start], p
a8d0: 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79  begin);.  put2by
a8e0: 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32  te(&data[start+2
a8f0: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67  ], size);.  pPag
a900: 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65  e->nFree = pPage
a910: 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31 36 29 73  ->nFree + (u16)s
a920: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65  ize;..  /* Coale
a930: 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65  sce adjacent fre
a940: 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64  e blocks */.  ad
a950: 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  dr = hdr + 1;.  
a960: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
a970: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a980: 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20  addr]))>0 ){.   
a990: 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a   int pnext, psiz
a9a0: 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74  e, x;.    assert
a9b0: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b  ( pbegin>addr );
a9c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62 65  .    assert( pbe
a9d0: 67 69 6e 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  gin <= (int)pPag
a9e0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a9f0: 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78  ze-4 );.    pnex
aa00: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
aa10: 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20  ta[pbegin]);.   
aa20: 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74   psize = get2byt
aa30: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
aa40: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67  ]);.    if( pbeg
aa50: 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e  in + psize + 3 >
aa60: 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74  = pnext && pnext
aa70: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
aa80: 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28  frag = pnext - (
aa90: 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20  pbegin+psize);. 
aaa0: 20 20 20 20 20 69 66 28 20 28 66 72 61 67 3c 30       if( (frag<0
aab0: 29 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29  ) || (frag>(int)
aac0: 64 61 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a  data[hdr+7]) ){.
aad0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
aae0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
aaf0: 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
ab00: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d    data[hdr+7] -=
ab10: 20 28 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20   (u8)frag;.     
ab20: 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   x = get2byte(&d
ab30: 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20  ata[pnext]);.   
ab40: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
ab50: 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20  a[pbegin], x);. 
ab60: 20 20 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b       x = pnext +
ab70: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
ab80: 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67  pnext+2]) - pbeg
ab90: 69 6e 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79  in;.      put2by
aba0: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
abb0: 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73  2], x);.    }els
abc0: 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  e{.      addr = 
abd0: 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  pbegin;.    }.  
abe0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
abf0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
ac00: 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 66   begins with a f
ac10: 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65  reeblock, remove
ac20: 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61   it. */.  if( da
ac30: 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b  ta[hdr+1]==data[
ac40: 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68  hdr+5] && data[h
ac50: 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+2]==data[hdr+
ac60: 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f  6] ){.    int to
ac70: 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20  p;.    pbegin = 
ac80: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
ac90: 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63  dr+1]);.    memc
aca0: 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  py(&data[hdr+1],
acb0: 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20   &data[pbegin], 
acc0: 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  2);.    top = ge
acd0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
ace0: 2b 35 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28  +5]) + get2byte(
acf0: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
ad00: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
ad10: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
ad20: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
ad30: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
ad40: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
ad50: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
ad60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ad70: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
ad80: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
ad90: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
ada0: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
adb0: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
adc0: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
add0: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
ade0: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
adf0: 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  dingly..**.** On
ae00: 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
ae10: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
ae20: 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e  e supported.  An
ae30: 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ything different
ae40: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20  .** indicates a 
ae50: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
ae60: 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   files:.**.**   
ae70: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
ae80: 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  TA.**         PT
ae90: 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46  F_ZERODATA | PTF
aea0: 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20  _LEAF.**        
aeb0: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
aec0: 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20  PTF_INTKEY.**   
aed0: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
aee0: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20  TA | PTF_INTKEY 
aef0: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74  | PTF_LEAF.*/.st
af00: 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46  atic int decodeF
af10: 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  lags(MemPage *pP
af20: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74  age, int flagByt
af30: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
af40: 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f  pBt;     /* A co
af50: 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74  py of pPage->pBt
af60: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
af70: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d  Page->hdrOffset=
af80: 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  =(pPage->pgno==1
af90: 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
afa0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
afb0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
afc0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
afd0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
afe0: 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e  = (u8)(flagByte>
aff0: 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54  >3);  assert( PT
b000: 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29  F_LEAF == 1<<3 )
b010: 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20  ;.  flagByte &= 
b020: 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61  ~PTF_LEAF;.  pPa
b030: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
b040: 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65   = 4-4*pPage->le
b050: 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67  af;.  pBt = pPag
b060: 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c  e->pBt;.  if( fl
b070: 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41  agByte==(PTF_LEA
b080: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
b090: 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  EY) ){.    pPage
b0a0: 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20  ->intKey = 1;.  
b0b0: 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61    pPage->hasData
b0c0: 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   = pPage->leaf;.
b0d0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
b0e0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65  cal = pBt->maxLe
b0f0: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
b100: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
b110: 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20  inLeaf;.  }else 
b120: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54  if( flagByte==PT
b130: 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20  F_ZERODATA ){.  
b140: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
b150: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
b160: 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  hasData = 0;.   
b170: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
b180: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
b190: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
b1a0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
b1b0: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
b1c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b1d0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b1e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
b1f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b200: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
b210: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
b220: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
b230: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
b240: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
b250: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
b260: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
b270: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
b280: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
b290: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
b2a0: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
b2b0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
b2c0: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
b2d0: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
b2e0: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
b2f0: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
b300: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
b310: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
b320: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
b330: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
b340: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
b350: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
b360: 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
b370: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
b380: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
b390: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
b3a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
b3b0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
b3c0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
b3d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b3e0: 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50  ->pgno==sqlite3P
b3f0: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
b400: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
b410: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
b420: 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  e == sqlite3Page
b430: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
b440: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
b450: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
b460: 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  ata == sqlite3Pa
b470: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
b480: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
b490: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49   if( !pPage->isI
b4a0: 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70  nit ){.    u16 p
b4b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
b4c0: 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72   Address of a fr
b4d0: 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70  eeblock within p
b4e0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f  Page->aData[] */
b4f0: 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20  .    u8 hdr;    
b500: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
b510: 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f  t to beginning o
b520: 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
b530: 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20  .    u8 *data;  
b540: 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c          /* Equal
b550: 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61   to pPage->aData
b560: 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64   */.    BtShared
b570: 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a   *pBt;        /*
b580: 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20   The main btree 
b590: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
b5a0: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
b5b0: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
b5c0: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
b5d0: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
b5e0: 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74    u16 cellOffset
b5f0: 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66  ;    /* Offset f
b600: 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67  rom start of pag
b610: 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20  e to first cell 
b620: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  pointer */.    i
b630: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
b640: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
b650: 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74  nused bytes on t
b660: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69  he page */.    i
b670: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
b680: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
b690: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
b6a0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20  ent area */.    
b6b0: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
b6c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
b6d0: 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  wable cell or fr
b6e0: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
b6f0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c  /.    int iCellL
b700: 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74  ast;     /* Last
b710: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f   possible cell o
b720: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
b730: 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d  et */..    pBt =
b740: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20   pPage->pBt;..  
b750: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
b760: 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61  drOffset;.    da
b770: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
b780: 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64  a;.    if( decod
b790: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61  eFlags(pPage, da
b7a0: 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72  ta[hdr]) ) retur
b7b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b7c0: 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72  _BKPT;.    asser
b7d0: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
b7e0: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
b7f0: 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
b800: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  .    pPage->mask
b810: 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74  Page = (u16)(pBt
b820: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b  ->pageSize - 1);
b830: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  .    pPage->nOve
b840: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75  rflow = 0;.    u
b850: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
b860: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20  >usableSize;.   
b870: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
b880: 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  et = cellOffset 
b890: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
b8a0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
b8b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
b8c0: 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69  = &data[usableSi
b8d0: 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ze];.    pPage->
b8e0: 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
b8f0: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20  [cellOffset];.  
b900: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
b910: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
b920: 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65  r+5]);.    pPage
b930: 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
b940: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
b950: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
b960: 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
b970: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
b980: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
b990: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
b9a0: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
b9b0: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
b9c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b9d0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b9e0: 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
b9f0: 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  se( pPage->nCell
ba00: 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  ==MX_CELL(pBt) )
ba10: 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66  ;..    /* A malf
ba20: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
ba30: 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20  age might cause 
ba40: 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20  us to read past 
ba50: 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f  the end.    ** o
ba60: 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73  f page when pars
ba70: 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20  ing a cell.  .  
ba80: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
ba90: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
baa0: 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65  of code checks e
bab0: 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61  arly to see if a
bac0: 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20   cell extends.  
bad0: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
bae0: 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e  d of a page boun
baf0: 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20  dary and causes 
bb00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74  SQLITE_CORRUPT t
bb10: 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74  o be .    ** ret
bb20: 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73  urned if it does
bb30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65  ..    */.    iCe
bb40: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
bb50: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
bb60: 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c  nCell;.    iCell
bb70: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
bb80: 65 20 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e  e - 4;.#if defin
bb90: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
bba0: 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43  _OVERSIZE_CELL_C
bbb0: 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20  HECK).    {.    
bbc0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
bbd0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74      /* Index int
bbe0: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
bbf0: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  er array */.    
bc00: 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20    int sz;       
bc10: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
bc20: 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20   cell */..      
bc30: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
bc40: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
bc50: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
bc60: 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
bc70: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20  ++){.        pc 
bc80: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
bc90: 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d  [cellOffset+i*2]
bca0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
bcb0: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69  ase( pc==iCellFi
bcc0: 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74  rst );.        t
bcd0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
bce0: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20  llLast );.      
bcf0: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
bd00: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
bd10: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ast ){.         
bd20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
bd30: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
bd40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
bd50: 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
bd60: 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d  pPage, &data[pc]
bd70: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
bd80: 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62  ase( pc+sz==usab
bd90: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
bda0: 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62    if( pc+sz>usab
bdb0: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
bdc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bdd0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
bde0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bdf0: 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  }.      if( !pPa
be00: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
be10: 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a  Last++;.    }  .
be20: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43  #endif..    /* C
be30: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
be40: 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74   free space on t
be50: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70  he page */.    p
be60: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
be70: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
be80: 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
be90: 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77  +7] + top;.    w
bea0: 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20  hile( pc>0 ){.  
beb0: 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69      u16 next, si
bec0: 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63  ze;.      if( pc
bed0: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
bee0: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
bef0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20         /* Start 
bf00: 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  of free block is
bf10: 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f   off the page */
bf20: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
bf30: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
bf40: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
bf50: 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62      next = get2b
bf60: 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a  yte(&data[pc]);.
bf70: 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74        size = get
bf80: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
bf90: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e  ]);.      if( (n
bfa0: 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70  ext>0 && next<=p
bfb0: 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b  c+size+3) || pc+
bfc0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
bfd0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72  ){.        /* Fr
bfe0: 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62  ee blocks must b
bff0: 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  e in ascending o
c000: 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61  rder. And the la
c010: 73 74 20 62 79 74 65 20 6f 66 0a 09 2a 2a 20 74  st byte of..** t
c020: 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75  he free-block mu
c030: 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61  st lie on the da
c040: 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f  tabase page.  */
c050: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c060: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
c070: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
c080: 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
c090: 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
c0a0: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d  pc = next;.    }
c0b0: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
c0c0: 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f   point, nFree co
c0d0: 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f  ntains the sum o
c0e0: 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  f the offset to 
c0f0: 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  the start.    **
c100: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
c110: 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
c120: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
c130: 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
c140: 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63     ** the cell-c
c150: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
c160: 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
c170: 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
c180: 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  size.    ** of t
c190: 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  he page, then th
c1a0: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
c1b0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63  orrupted. This c
c1c0: 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a  heck also.    **
c1d0: 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66   serves to verif
c1e0: 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65  y that the offse
c1f0: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  t to the start o
c200: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
c210: 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20  nt.    ** area, 
c220: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
c230: 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
c240: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
c250: 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
c260: 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53  f( nFree>usableS
c270: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
c280: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c290: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
c2a0: 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
c2b0: 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d   = (u16)(nFree -
c2c0: 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20   iCellFirst);.  
c2d0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
c2e0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
c2f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c300: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
c310: 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
c320: 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
c330: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
c340: 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
c350: 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
c360: 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
c370: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
c380: 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
c390: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
c3a0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
c3b0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
c3c0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
c3d0: 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
c3e0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
c3f0: 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
c400: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
c410: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
c420: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
c430: 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
c440: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
c450: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
c460: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
c470: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
c480: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
c490: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
c4a0: 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
c4b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
c4c0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
c4d0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
c4e0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
c4f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
c500: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
c510: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
c520: 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a  secureDelete ){.
c530: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
c540: 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
c550: 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
c560: 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72  ;.  }.  data[hdr
c570: 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b  ] = (char)flags;
c580: 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
c590: 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50   8 + 4*((flags&P
c5a0: 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30  TF_LEAF)==0 ?1:0
c5b0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  );.  memset(&dat
c5c0: 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
c5d0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
c5e0: 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   0;.  put2byte(&
c5f0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74  data[hdr+5], pBt
c600: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
c610: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
c620: 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u16)(pBt->usabl
c630: 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a  eSize - first);.
c640: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
c650: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
c660: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
c670: 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e  = hdr;.  pPage->
c680: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
c690: 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  st;.  pPage->aDa
c6a0: 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42  taEnd = &data[pB
c6b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  t->usableSize];.
c6c0: 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64    pPage->aCellId
c6d0: 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d  x = &data[first]
c6e0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
c6f0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65  flow = 0;.  asse
c700: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
c710: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
c720: 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
c730: 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ;.  pPage->maskP
c740: 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
c750: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
c760: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
c770: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
c780: 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
c790: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
c7a0: 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
c7b0: 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
c7c0: 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
c7d0: 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
c7e0: 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
c7f0: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
c800: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
c810: 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
c820: 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
c830: 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
c840: 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
c850: 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
c860: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
c870: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
c880: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
c890: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
c8a0: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
c8b0: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
c8c0: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
c8d0: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
c8e0: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
c8f0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
c900: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
c910: 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75   100 : 0;.  retu
c920: 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
c930: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
c940: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
c950: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
c960: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
c970: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
c980: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
c990: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
c9a0: 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
c9b0: 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
c9c0: 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
c9d0: 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
c9e0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
c9f0: 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
ca00: 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
ca10: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
ca20: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
ca30: 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
ca40: 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
ca50: 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
ca60: 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
ca70: 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
ca80: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
ca90: 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
caa0: 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
cab0: 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
cac0: 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
cad0: 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
cae0: 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
caf0: 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
cb00: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
cb10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
cb20: 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
cb30: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
cb40: 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
cb50: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
cb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
cb70: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
cb80: 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
cb90: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
cba0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
cbb0: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
cbc0: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
cbd0: 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
cbe0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64    /* Do not load
cbf0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66   page content if
cc00: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
cc10: 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
cc20: 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
cc30: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
cc40: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
cc50: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
cc60: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
cc70: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
cc80: 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
cc90: 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  DbPage, noConten
cca0: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
ccb0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
ccc0: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
ccd0: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
cce0: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
ccf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cd00: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
cd10: 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
cd20: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
cd30: 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
cd40: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
cd50: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
cd60: 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
cd70: 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
cd80: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
cd90: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
cda0: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
cdb0: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
cdc0: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
cdd0: 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
cde0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
cdf0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
ce00: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
ce10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ce20: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
ce30: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
ce40: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
ce50: 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
ce60: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
ce70: 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
ce80: 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
ce90: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
cea0: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
ceb0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
cec0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
ced0: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
cee0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
cef0: 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
cf00: 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
cf10: 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
cf20: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
cf30: 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
cf40: 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
cf50: 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
cf60: 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
cf70: 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
cf80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
cf90: 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
cfa0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
cfb0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
cfc0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
cfd0: 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
cfe0: 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30  e)&0x8000000)==0
cff0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e   );.  return (in
d000: 74 29 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  t)btreePagecount
d010: 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
d020: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
d030: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
d040: 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20   initialize it. 
d050: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
d060: 20 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65   just a.** conve
d070: 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61  nience wrapper a
d080: 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63  round separate c
d090: 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74  alls to btreeGet
d0a0: 50 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62  Page() and .** b
d0b0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
d0c0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
d0d0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
d0e0: 68 65 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65  he value *ppPage
d0f0: 20 69 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e   is set to is un
d100: 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d  defined. It.** m
d110: 61 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e  ay remain unchan
d120: 67 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62  ged, or it may b
d130: 65 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61  e set to an inva
d140: 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  lid value..*/.st
d150: 61 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49  atic int getAndI
d160: 6e 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  nitPage(.  BtSha
d170: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
d180: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
d190: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
d1a0: 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
d1b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
d1c0: 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
d1d0: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
d1e0: 50 61 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74  Page     /* Writ
d1f0: 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74  e the page point
d200: 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  er here */.){.  
d210: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
d220: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d230: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
d240: 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e   );..  if( pgno>
d250: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
d260: 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Bt) ){.    rc = 
d270: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d280: 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KPT;.  }else{.  
d290: 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
d2a0: 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
d2b0: 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  pPage, 0);.    i
d2c0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d2d0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
d2e0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
d2f0: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
d300: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d310: 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
d320: 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
d330: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d340: 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  }..  testcase( p
d350: 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno==0 );.  asse
d360: 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72  rt( pgno!=0 || r
d370: 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
d380: 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  T );.  return rc
d390: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
d3a0: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
d3b0: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
d3c0: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
d3d0: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
d3e0: 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
d3f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d400: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
d410: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
d420: 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
d430: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d440: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
d450: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
d460: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
d470: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
d480: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
d490: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
d4a0: 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  age );.    asser
d4b0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
d4c0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
d4d0: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
d4e0: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
d4f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d500: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
d510: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
d520: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
d530: 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
d540: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
d550: 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
d560: 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
d570: 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
d580: 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
d590: 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
d5a0: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
d5b0: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
d5c0: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
d5d0: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
d5e0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
d5f0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
d600: 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
d610: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
d620: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
d630: 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
d640: 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
d650: 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
d660: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
d670: 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
d680: 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
d690: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
d6a0: 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
d6b0: 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20  Page *pData){.  
d6c0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
d6d0: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
d6e0: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
d6f0: 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29  rGetExtra(pData)
d700: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d710: 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
d720: 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b  ount(pData)>0 );
d730: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73  .  if( pPage->is
d740: 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Init ){.    asse
d750: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d760: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
d770: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
d780: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
d790: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
d7a0: 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
d7b0: 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b  ount(pData)>1 ){
d7c0: 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20  .      /* pPage 
d7d0: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62  might not be a b
d7e0: 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d  tree page;  it m
d7f0: 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66  ight be an overf
d800: 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a  low page.      *
d810: 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65  * or ptrmap page
d820: 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e   or a free page.
d830: 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73    In those cases
d840: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
d850: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f        ** call to
d860: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
d870: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74   will likely ret
d880: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d890: 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74  PT..      ** But
d8a0: 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65   no harm is done
d8b0: 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69   by this.  And i
d8c0: 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74  t is very import
d8d0: 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a  ant that.      *
d8e0: 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  * btreeInitPage(
d8f0: 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65  ) be called on e
d900: 76 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20  very btree page 
d910: 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20  so we make.     
d920: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72   ** the call for
d930: 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74   every page that
d940: 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65   comes in for re
d950: 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20  -initing. */.   
d960: 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
d970: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
d980: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
d990: 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
d9a0: 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e  ler for a btree.
d9b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
d9c0: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
d9d0: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67  ndler(void *pArg
d9e0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
d9f0: 42 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29  Bt = (BtShared*)
da00: 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20  pArg;.  assert( 
da10: 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73  pBt->db );.  ass
da20: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
da30: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d  ex_held(pBt->db-
da40: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
da50: 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  urn sqlite3Invok
da60: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42  eBusyHandler(&pB
da70: 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  t->db->busyHandl
da80: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  er);.}../*.** Op
da90: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
daa0: 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65  le..** .** zFile
dab0: 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
dac0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
dad0: 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65   file.  If zFile
dae0: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  name is NULL.** 
daf0: 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  then an ephemera
db00: 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  l database is cr
db10: 65 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65  eated.  The ephe
db20: 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d  meral database m
db30: 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75  ight.** be exclu
db40: 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79  sively in memory
db50: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73  , or it might us
db60: 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d  e a disk-based m
db70: 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20  emory cache..** 
db80: 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
db90: 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
dba0: 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  se will be autom
dbb0: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
dbc0: 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65   .** when sqlite
dbd0: 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
dbe0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
dbf0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
dc00: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
dc10: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
dc20: 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
dc30: 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
dc40: 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
dc50: 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
dc60: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
dc70: 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65  "flags" paramete
dc80: 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
dc90: 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  hat might contai
dca0: 6e 20 62 69 74 73 0a 2a 2a 20 42 54 52 45 45 5f  n bits.** BTREE_
dcb0: 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
dcc0: 2f 6f 72 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41  /or BTREE_NO_REA
dcd0: 44 4c 4f 43 4b 2e 20 20 54 68 65 20 42 54 52 45  DLOCK.  The BTRE
dce0: 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 0a 2a 2a  E_NO_READLOCK.**
dcf0: 20 62 69 74 20 69 73 20 61 6c 73 6f 20 73 65 74   bit is also set
dd00: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4e   if the SQLITE_N
dd10: 6f 52 65 61 64 6c 6f 63 6b 20 66 6c 61 67 73 20  oReadlock flags 
dd20: 69 73 20 73 65 74 20 69 6e 20 64 62 2d 3e 66 6c  is set in db->fl
dd30: 61 67 73 2e 0a 2a 2a 20 54 68 65 73 65 20 66 6c  ags..** These fl
dd40: 61 67 73 20 61 72 65 20 70 61 73 73 65 64 20 74  ags are passed t
dd50: 68 72 6f 75 67 68 20 69 6e 74 6f 20 73 71 6c 69  hrough into sqli
dd60: 74 65 33 50 61 67 65 72 4f 70 65 6e 28 29 20 61  te3PagerOpen() a
dd70: 6e 64 20 6d 75 73 74 0a 2a 2a 20 62 65 20 74 68  nd must.** be th
dd80: 65 20 73 61 6d 65 20 76 61 6c 75 65 73 20 61 73  e same values as
dd90: 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
dda0: 4e 41 4c 20 61 6e 64 20 50 41 47 45 52 5f 4e 4f  NAL and PAGER_NO
ddb0: 5f 52 45 41 44 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  _READLOCK..**.**
ddc0: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
ddd0: 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
dde0: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ed in the same d
ddf0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
de00: 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  on.** and we are
de10: 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65   in shared cache
de20: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
de30: 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77  open will fail w
de40: 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45  ith an.** SQLITE
de50: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f  _CONSTRAINT erro
de60: 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c  r.  We cannot al
de70: 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  low two or more 
de80: 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65  BtShared.** obje
de90: 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  cts in the same 
dea0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
deb0: 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20  ion since doing 
dec0: 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20  so will lead.** 
ded0: 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  to problems with
dee0: 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   locking..*/.int
def0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
df00: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
df10: 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20   *pVfs,      /* 
df20: 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74  VFS to use for t
df30: 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  his b-tree */.  
df40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
df50: 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
df60: 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
df70: 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
df80: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
df90: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
dfa0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
dfb0: 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ated database ha
dfc0: 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ndle */.  Btree 
dfd0: 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20  **ppBtree,      
dfe0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
dff0: 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74  new Btree object
e000: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
e010: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
e020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
e030: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76  tions */.  int v
e040: 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
e050: 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
e060: 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
e070: 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
e080: 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  ) */.){.  BtShar
e090: 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20  ed *pBt = 0;    
e0a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
e0b0: 65 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65  ed part of btree
e0c0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
e0d0: 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20  Btree *p;       
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e0f0: 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75  * Handle to retu
e100: 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rn */.  sqlite3_
e110: 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e  mutex *mutexOpen
e120: 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e   = 0;  /* Preven
e130: 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  ts a race condit
e140: 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33  ion. Ticket #353
e150: 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  7 */.  int rc = 
e160: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
e170: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
e180: 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66  code from this f
e190: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  unction */.  u8 
e1a0: 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20  nReserve;       
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
e1c0: 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70  yte of unused sp
e1d0: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
e1e0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
e1f0: 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30  har zDbHeader[10
e200: 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  0];  /* Database
e210: 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20   header content 
e220: 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66  */..  /* True if
e230: 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65   opening an ephe
e240: 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79  meral, temporary
e250: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
e260: 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44  onst int isTempD
e270: 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  b = zFilename==0
e280: 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
e290: 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ==0;..  /* Set t
e2a0: 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65  he variable isMe
e2b0: 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20  mdb to true for 
e2c0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
e2d0: 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20  abase, or .  ** 
e2e0: 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65  false for a file
e2f0: 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e  -based database.
e300: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
e310: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
e320: 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  B.  const int is
e330: 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65  Memdb = 0;.#else
e340: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
e350: 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d  emdb = (zFilenam
e360: 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c  e && strcmp(zFil
e370: 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
e380: 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20  ")==0).         
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
e3a0: 20 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71   (isTempDb && sq
e3b0: 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
e3c0: 79 28 64 62 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  y(db));.#endif..
e3d0: 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
e3e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
e3f0: 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
e400: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e410: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
e420: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  );.  assert( (fl
e430: 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73  ags&0xff)==flags
e440: 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66   );   /* flags f
e450: 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a  it in 8 bits */.
e460: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52  .  /* Only a BTR
e470: 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
e480: 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f  se can be BTREE_
e490: 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61  UNORDERED */.  a
e4a0: 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
e4b0: 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
e4c0: 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
e4d0: 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30  BTREE_SINGLE)!=0
e4e0: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45   );..  /* A BTRE
e4f0: 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
e500: 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65  e is always a te
e510: 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65  mporary and/or e
e520: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73  phemeral */.  as
e530: 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
e540: 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  TREE_SINGLE)==0 
e550: 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a  || isTempDb );..
e560: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
e570: 26 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61 64 6c  & SQLITE_NoReadl
e580: 6f 63 6b 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  ock ){.    flags
e590: 20 7c 3d 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41   |= BTREE_NO_REA
e5a0: 44 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  DLOCK;.  }.  if(
e5b0: 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
e5c0: 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d  flags |= BTREE_M
e5d0: 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28  EMORY;.  }.  if(
e5e0: 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
e5f0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
e600: 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  )!=0 && (isMemdb
e610: 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b   || isTempDb) ){
e620: 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20  .    vfsFlags = 
e630: 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c  (vfsFlags & ~SQL
e640: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
e650: 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ) | SQLITE_OPEN_
e660: 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70  TEMP_DB;.  }.  p
e670: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
e680: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
e690: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
e6a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e6b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
e6c0: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
e6d0: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
e6e0: 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53   = db;.#ifndef S
e6f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
e700: 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63  D_CACHE.  p->loc
e710: 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  k.pBtree = p;.  
e720: 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d  p->lock.iTable =
e730: 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   1;.#endif..#if 
e740: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e750: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
e760: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
e770: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
e780: 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
e790: 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
e7a0: 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
e7b0: 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
e7c0: 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
e7d0: 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
e7e0: 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
e7f0: 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
e800: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d    */.  if( isMem
e810: 64 62 3d 3d 30 20 26 26 20 69 73 54 65 6d 70 44  db==0 && isTempD
e820: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  b==0 ){.    if( 
e830: 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
e840: 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
e850: 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
e860: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
e870: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
e880: 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
e890: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
e8a0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46  sqlite3Malloc(nF
e8b0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e8c0: 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
e8d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
e8e0: 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
e8f0: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
e900: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
e910: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
e920: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e930: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
e940: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e950: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
e960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46        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 20 6e 46 75  , zFilename, nFu
e990: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
e9a0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 23 69 66 20  lPathname);.#if 
e9b0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
e9c0: 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65  E.      mutexOpe
e9d0: 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  n = sqlite3Mutex
e9e0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
e9f0: 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b  EX_STATIC_OPEN);
ea00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
ea10: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
ea20: 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74  Open);.      mut
ea30: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
ea40: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
ea50: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
ea60: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
ea70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
ea80: 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
ea90: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  ;.#endif.      f
eaa0: 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
eab0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
eac0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
ead0: 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
eae0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
eaf0: 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
eb00: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
eb10: 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
eb20: 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
eb30: 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
eb40: 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20  pBt->pPager)).  
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
eb60: 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66  & sqlite3PagerVf
eb70: 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  s(pBt->pPager)==
eb80: 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pVfs ){.        
eb90: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
eba0: 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d       for(iDb=db-
ebb0: 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20  >nDb-1; iDb>=0; 
ebc0: 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  iDb--){.        
ebd0: 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73      Btree *pExis
ebe0: 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69  ting = db->aDb[i
ebf0: 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20  Db].pBt;.       
ec00: 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69       if( pExisti
ec10: 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d  ng && pExisting-
ec20: 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20  >pBt==pBt ){.   
ec30: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ec40: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
ec50: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
ec60: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ec70: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
ec80: 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
ec90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
eca0: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
ecb0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
ecc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ecd0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
ece0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ecf0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
ed00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ed10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
ed20: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
ed30: 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52           pBt->nR
ed40: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
ed50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
ed60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
ed70: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
ed80: 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
ed90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
eda0: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
edb0: 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
edc0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
edd0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
ede0: 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   In debug mode, 
edf0: 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73  we mark all pers
ee00: 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73  istent databases
ee10: 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20   as sharable.   
ee20: 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20     ** even when 
ee30: 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54  they are not.  T
ee40: 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68  his exercises th
ee50: 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61  e locking code a
ee60: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65  nd.      ** give
ee70: 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  s more opportuni
ee80: 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73  ty for asserts(s
ee90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
eea0: 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74  d()).      ** st
eeb0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64  atements to find
eec0: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d   locking problem
eed0: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
eee0: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
eef0: 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
ef00: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
ef10: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pBt==0 ){.    /
ef20: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
ef30: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
ef40: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
ef50: 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
ef60: 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
ef70: 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
ef80: 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
ef90: 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
efa0: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
efb0: 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  t result.    ** 
efc0: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
efd0: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
efe0: 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20  chitecture..    
eff0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
f000: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c  izeof(i64)==8 ||
f010: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20   sizeof(i64)==4 
f020: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
f030: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c  izeof(u64)==8 ||
f040: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20   sizeof(u64)==4 
f050: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
f060: 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
f070: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f080: 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
f090: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
f0a0: 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
f0b0: 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
f0c0: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
f0d0: 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
f0e0: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
f0f0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f100: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
f110: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
f120: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
f130: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
f140: 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e  pen(pVfs, &pBt->
f150: 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d  pPager, zFilenam
f160: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54               EXT
f180: 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20  RA_SIZE, flags, 
f190: 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65  vfsFlags, pageRe
f1a0: 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72  init);.    if( r
f1b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f1c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f1d0: 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
f1e0: 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65  eader(pBt->pPage
f1f0: 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  r,sizeof(zDbHead
f200: 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a  er),zDbHeader);.
f210: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
f220: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f230: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
f240: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
f250: 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61      pBt->openFla
f260: 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a  gs = (u8)flags;.
f270: 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62      pBt->db = db
f280: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
f290: 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
f2a0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74  (pBt->pPager, bt
f2b0: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
f2c0: 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20  dler, pBt);.    
f2d0: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
f2e0: 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
f2f0: 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
f300: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
f310: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
f320: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
f330: 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
f340: 65 72 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  er);.#ifdef SQLI
f350: 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
f360: 0a 20 20 20 20 70 42 74 2d 3e 73 65 63 75 72 65  .    pBt->secure
f370: 44 65 6c 65 74 65 20 3d 20 31 3b 0a 23 65 6e 64  Delete = 1;.#end
f380: 69 66 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  if.    pBt->page
f390: 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
f3a0: 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
f3b0: 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
f3c0: 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
f3d0: 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
f3e0: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
f3f0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
f400: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
f410: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
f420: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
f430: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
f440: 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
f450: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f460: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
f470: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
f480: 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
f490: 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
f4a0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
f4b0: 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
f4c0: 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
f4d0: 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
f4e0: 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
f4f0: 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
f500: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
f510: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
f520: 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
f530: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
f540: 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
f550: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
f560: 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
f570: 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
f580: 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
f590: 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
f5a0: 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
f5b0: 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
f5c0: 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
f5d0: 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
f5e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
f5f0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
f600: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
f610: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
f620: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
f630: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
f640: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
f650: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
f660: 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
f670: 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
f680: 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
f690: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
f6a0: 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
f6b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52   }else{.      nR
f6c0: 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
f6d0: 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
f6e0: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
f6f0: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
f700: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f710: 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
f720: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
f730: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
f740: 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
f750: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
f760: 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
f770: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
f780: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
f790: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
f7a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
f7b0: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
f7c0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
f7d0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
f7e0: 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72  erve);.    if( r
f7f0: 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f  c ) goto btree_o
f800: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74  pen_out;.    pBt
f810: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
f820: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
f830: 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
f840: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
f850: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
f860: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
f870: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
f880: 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  */.   .#if !defi
f890: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f8a0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
f8b0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f8c0: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
f8d0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
f8e0: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
f8f0: 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
f900: 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
f910: 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
f920: 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
f930: 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45  le ){.      MUTE
f940: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
f950: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
f960: 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 42 74  red; ).      pBt
f970: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
f980: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d    MUTEX_LOGIC( m
f990: 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
f9a0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
f9b0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
f9c0: 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20  IC_MASTER);).   
f9d0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
f9e0: 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
f9f0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
fa00: 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
fa10: 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
fa20: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
fa30: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
fa40: 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
fa50: 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
fa60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
fa70: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
fa80: 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  M;.          db-
fa90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
faa0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  0;.          got
fab0: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
fac0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fad0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
fae0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
faf0: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
fb00: 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
fb10: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
fb20: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
fb30: 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
fb40: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
fb50: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
fb60: 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
fb70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
fb80: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
fb90: 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
fba0: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
fbb0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
fbc0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
fbd0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
fbe0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
fbf0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
fc00: 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
fc10: 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
fc20: 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
fc30: 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
fc40: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
fc50: 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
fc60: 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
fc70: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
fc80: 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
fc90: 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
fca0: 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
fcb0: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
fcc0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
fcd0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
fce0: 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
fcf0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
fd00: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
fd10: 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
fd20: 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
fd30: 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
fd40: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
fd50: 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
fd60: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
fd70: 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
fd80: 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
fd90: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
fda0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
fdb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
fdc0: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
fdd0: 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
fde0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
fdf0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
fe00: 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
fe10: 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
fe20: 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
fe30: 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
fe40: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
fe50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
fe60: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
fe70: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
fe80: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
fe90: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
fea0: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
feb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
fec0: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
fed0: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
fee0: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
fef0: 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
ff00: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
ff10: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
ff20: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
ff30: 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
ff40: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
ff50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ff60: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
ff70: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
ff80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
ff90: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
ffa0: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
ffb0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ffc0: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
ffd0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
ffe0: 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  pBtree = 0;.  }e
fff0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
10000 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
10010 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
10020 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
10030 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
10040 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
10050 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c  t value. Except,
10060 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e   when opening on
10070 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61   an existing sha
10080 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c  red pager-cache,
10090 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63  .    ** do not c
100a0 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d  hange the pager-
100b0 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20  cache size..    
100c0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
100d0 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c  e3BtreeSchema(p,
100e0 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0, 0)==0 ){.   
100f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
10100 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70  etCachesize(p->p
10110 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
10120 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
10130 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _SIZE);.    }.  
10140 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65  }.  if( mutexOpe
10150 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
10160 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10170 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29  eld(mutexOpen) )
10180 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
10190 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
101a0 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pen);.  }.  retu
101b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
101c0 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74  Decrement the Bt
101d0 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
101e0 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65  ter.  When it re
101f0 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72  aches zero,.** r
10200 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72  emove the BtShar
10210 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ed structure fro
10220 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  m the sharing li
10230 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  st.  Return.** t
10240 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61  rue if the BtSha
10250 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
10260 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e   reaches zero an
10270 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73  d return.** fals
10280 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c  e if it is still
10290 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74   positive..*/.st
102a0 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46  atic int removeF
102b0 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42  romSharingList(B
102c0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23  tShared *pBt){.#
102d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
102e0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
102f0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
10300 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
10310 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61  aster; ).  BtSha
10320 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
10330 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
10340 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10350 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
10360 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10370 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
10380 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
10390 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
103a0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
103b0 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74  STER); ).  sqlit
103c0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
103d0 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
103e0 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
103f0 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
10400 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53    if( GLOBAL(BtS
10410 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
10420 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d  aredCacheList)==
10430 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f  pBt ){.      GLO
10440 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
10450 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
10460 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65  List) = pBt->pNe
10470 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
10480 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f       pList = GLO
10490 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
104a0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
104b0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
104c0 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  le( ALWAYS(pList
104d0 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  ) && pList->pNex
104e0 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t!=pBt ){.      
104f0 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70    pList=pList->p
10500 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
10510 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
10520 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
10530 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pList->pNext = 
10540 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
10550 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
10560 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
10570 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  AFE ){.      sql
10580 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
10590 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
105a0 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d   }.    removed =
105b0 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
105c0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
105d0 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
105e0 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a   removed;.#else.
105f0 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
10600 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
10610 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
10620 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
10630 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
10640 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
10650 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a  (pBt) bytes..*/.
10660 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f  static void allo
10670 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74  cateTempSpace(Bt
10680 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
10690 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70  if( !pBt->pTmpSp
106a0 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
106b0 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
106c0 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70  te3PageMalloc( p
106d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
106e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
106f0 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
10700 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
10710 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
10720 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
10730 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
10740 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20  qlite3PageFree( 
10750 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
10760 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  .  pBt->pTmpSpac
10770 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
10780 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
10790 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
107a0 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
107b0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
107c0 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
107d0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
107e0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
107f0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
10800 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
10810 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
10820 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
10830 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
10840 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10850 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
10860 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
10870 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
10880 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
10890 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
108a0 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
108b0 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
108c0 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
108d0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
108e0 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
108f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10900 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
10910 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
10920 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
10930 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
10940 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
10950 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
10960 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
10970 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
10980 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
10990 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
109a0 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
109b0 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
109c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
109d0 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20  eeRollback(p);. 
109e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
109f0 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ve(p);..  /* If 
10a00 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  there are still 
10a10 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e  other outstandin
10a20 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
10a30 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
10a40 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  .  ** structure,
10a50 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65   return now. The
10a60 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
10a70 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
10a80 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ans .  ** up the
10a90 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20   shared-btree.. 
10aa0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
10ab0 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26  >wantToLock==0 &
10ac0 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  & p->locked==0 )
10ad0 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72  ;.  if( !p->shar
10ae0 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72  able || removeFr
10af0 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42  omSharingList(pB
10b00 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  t) ){.    /* The
10b10 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   pBt is no longe
10b20 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67  r on the sharing
10b30 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e   list, so we can
10b40 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69   access.    ** i
10b50 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
10b60 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
10b70 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
10b80 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20  * Clean out and 
10b90 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61  delete the BtSha
10ba0 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20  red object..    
10bb0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
10bc0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
10bd0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
10be0 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
10bf0 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  r);.    if( pBt-
10c00 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20  >xFreeSchema && 
10c10 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
10c20 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65        pBt->xFree
10c30 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68  Schema(pBt->pSch
10c40 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
10c50 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
10c60 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a   pBt->pSchema);.
10c70 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
10c80 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
10c90 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
10ca0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
10cb0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
10cc0 41 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70  ACHE.  assert( p
10cd0 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
10ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
10cf0 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
10d00 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d  f( p->pPrev ) p-
10d10 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
10d20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  p->pNext;.  if( 
10d30 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e  p->pNext ) p->pN
10d40 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
10d50 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20  pPrev;.#endif.. 
10d60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
10d70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10d80 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
10d90 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
10da0 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
10db0 20 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69   pages allowed i
10dc0 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a  n the cache..**.
10dd0 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
10de0 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
10df0 61 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74  ages is set to t
10e00 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76  he absolute.** v
10e10 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20  alue of mxPage. 
10e20 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
10e30 67 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65  gative, the page
10e40 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74  r will.** operat
10e50 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  e asynchronously
10e60 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73   - it will not s
10e70 74 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28  top to do fsync(
10e80 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20  )s.** to insure 
10e90 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
10ea0 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
10eb0 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f  ace before.** co
10ec0 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73  ntinuing.  Trans
10ed0 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f  actions still wo
10ee0 72 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  rk if synchronou
10ef0 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64  s is off,.** and
10f00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
10f10 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65  nnot be corrupte
10f20 64 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61  d if this progra
10f30 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42  m.** crashes.  B
10f40 75 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ut if the operat
10f50 69 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68  ing system crash
10f60 65 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a  es or there is.*
10f70 2a 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  * an abrupt powe
10f80 72 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73  r failure when s
10f90 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
10fa0 66 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  f, the database.
10fb0 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74  ** could be left
10fc0 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
10fd0 65 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65  ent and unrecove
10fe0 72 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20  rable state..** 
10ff0 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f  Synchronous is o
11000 6e 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20  n by default so 
11010 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
11020 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f  ion is not.** no
11030 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a  rmally a worry..
11040 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11050 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28  reeSetCacheSize(
11060 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
11070 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
11080 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
11090 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
110a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
110b0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
110c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
110d0 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
110e0 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
110f0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  e(pBt->pPager, m
11100 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
11110 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
11120 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11130 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
11140 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61  nge the way data
11150 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69   is synced to di
11160 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  sk in order to i
11170 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65  ncrease or decre
11180 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20  ase.** how well 
11190 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73  the database res
111a0 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20  ists damage due 
111b0 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e  to OS crashes an
111c0 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  d power.** failu
111d0 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73  res.  Level 1 is
111e0 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79   the same as asy
111f0 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79  nchronous (no sy
11200 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a  ncs() occur and.
11210 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69  ** there is a hi
11220 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  gh probability o
11230 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c  f damage)  Level
11240 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c   2 is the defaul
11250 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20  t.  There.** is 
11260 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e  a very low but n
11270 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c  on-zero probabil
11280 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20  ity of damage.  
11290 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20  Level 3 reduces 
112a0 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69  the.** probabili
112b0 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20  ty of damage to 
112c0 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69  near zero but wi
112d0 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f  th a write perfo
112e0 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e  rmance reduction
112f0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
11300 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
11310 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74  RAGMAS.int sqlit
11320 65 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79  e3BtreeSetSafety
11330 4c 65 76 65 6c 28 0a 20 20 42 74 72 65 65 20 2a  Level(.  Btree *
11340 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
11350 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20  /* The btree to 
11360 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20 6c  set the safety l
11370 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74  evel on */.  int
11380 20 6c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20   level,         
11390 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 79      /* PRAGMA sy
113a0 6e 63 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46  nchronous.  1=OF
113b0 46 2c 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46  F, 2=NORMAL, 3=F
113c0 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 66 75 6c  ULL */.  int ful
113d0 6c 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  lSync,          
113e0 2f 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73  /* PRAGMA fullfs
113f0 79 6e 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 63 6b  ync. */.  int ck
11400 70 74 46 75 6c 6c 53 79 6e 63 20 20 20 20 20 20  ptFullSync      
11410 20 2f 2a 20 50 52 41 47 4d 41 20 63 68 65 63 6b   /* PRAGMA check
11420 70 6f 69 6e 74 5f 66 75 6c 6c 66 79 6e 63 20 2a  point_fullfync *
11430 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
11440 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
11450 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11460 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
11470 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
11480 73 73 65 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20  ssert( level>=1 
11490 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20  && level<=3 );. 
114a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
114b0 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
114c0 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
114d0 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  vel(pBt->pPager,
114e0 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63   level, fullSync
114f0 2c 20 63 6b 70 74 46 75 6c 6c 53 79 6e 63 29 3b  , ckptFullSync);
11500 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
11510 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
11520 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
11530 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
11540 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
11550 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20 73  given btree is s
11560 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76  et to safety lev
11570 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a  el 1.  In other.
11580 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  ** words, return
11590 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63   TRUE if no sync
115a0 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65  () occurs on the
115b0 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a   disk files..*/.
115c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
115d0 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72  SyncDisabled(Btr
115e0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
115f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
11600 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
11610 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11620 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
11630 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71  mutex) );  .  sq
11640 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11650 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
11660 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
11670 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
11680 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42  e3PagerNosync(pB
11690 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71  t->pPager);.  sq
116a0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
116b0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
116c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
116d0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
116e0 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20  es size and the 
116f0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
11700 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ed bytes per pag
11710 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  e..** Or, if the
11720 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61   page size has a
11730 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65  lready been fixe
11740 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
11750 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69  _READONLY .** wi
11760 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61  thout changing a
11770 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  nything..**.** T
11780 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
11790 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
117a0 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
117b0 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
117c0 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
117d0 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
117e0 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
117f0 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
11800 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
11810 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
11820 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
11830 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
11840 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
11850 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
11860 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
11870 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
11880 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
11890 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
118a0 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
118b0 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
118c0 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
118d0 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
118e0 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
118f0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
11900 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
11910 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
11920 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
11930 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
11940 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
11950 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
11960 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
11970 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
11980 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30  * If the iFix!=0
11990 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 53 69   then the pageSi
119a0 7a 65 46 69 78 65 64 20 66 6c 61 67 20 69 73 20  zeFixed flag is 
119b0 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
119c0 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
119d0 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
119e0 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
119f0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
11a00 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
11a10 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
11a20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
11a30 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
11a40 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
11a50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11a60 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11a70 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
11a80 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
11a90 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
11aa0 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
11ab0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
11ac0 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
11ad0 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 73 71  eFixed ){.    sq
11ae0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11af0 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
11b00 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
11b10 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
11b20 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
11b30 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
11b40 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
11b50 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
11b60 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
11b70 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
11b80 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
11b90 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
11ba0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
11bb0 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
11bc0 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
11bd0 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
11be0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
11bf0 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
11c00 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
11c10 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
11c20 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
11c30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
11c40 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
11c50 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
11c60 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
11c70 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
11c80 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
11c90 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
11ca0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
11cb0 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
11cc0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
11cd0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
11ce0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
11cf0 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 70 61  ( iFix ) pBt->pa
11d00 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
11d10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
11d20 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
11d30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
11d40 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
11d50 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
11d60 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
11d70 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
11d80 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
11d90 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
11da0 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69  >pageSize;.}..#i
11db0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
11dc0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
11dd0 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
11de0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
11df0 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  CUUM)./*.** Retu
11e00 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
11e10 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
11e20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
11e30 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
11e40 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
11e50 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
11e60 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
11e70 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
11e80 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
11e90 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
11ea0 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
11eb0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
11ec0 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
11ed0 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
11ee0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11ef0 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
11f00 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
11f10 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71  usableSize;.  sq
11f20 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11f30 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
11f40 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
11f50 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
11f60 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
11f70 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
11f80 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
11f90 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
11fa0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
11fb0 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
11fc0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
11fd0 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
11fe0 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
11ff0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
12000 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12010 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
12020 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
12030 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
12040 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12050 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
12060 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
12070 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
12080 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
12090 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
120a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
120b0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
120c0 65 74 20 74 68 65 20 73 65 63 75 72 65 44 65 6c  et the secureDel
120d0 65 74 65 20 66 6c 61 67 20 69 66 20 6e 65 77 46  ete flag if newF
120e0 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20  lag is 0 or 1.  
120f0 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31  If newFlag is -1
12100 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e  ,.** then make n
12110 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61  o changes.  Alwa
12120 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76 61  ys return the va
12130 6c 75 65 20 6f 66 20 74 68 65 20 73 65 63 75 72  lue of the secur
12140 65 44 65 6c 65 74 65 0a 2a 2a 20 73 65 74 74 69  eDelete.** setti
12150 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ng after the cha
12160 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nge..*/.int sqli
12170 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
12180 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69  lete(Btree *p, i
12190 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69  nt newFlag){.  i
121a0 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt b;.  if( p==0
121b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
121c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
121d0 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c  (p);.  if( newFl
121e0 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ag>=0 ){.    p->
121f0 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74  pBt->secureDelet
12200 65 20 3d 20 28 6e 65 77 46 6c 61 67 21 3d 30 29  e = (newFlag!=0)
12210 20 3f 20 31 20 3a 20 30 3b 0a 20 20 7d 20 0a 20   ? 1 : 0;.  } . 
12220 20 62 20 3d 20 70 2d 3e 70 42 74 2d 3e 73 65 63   b = p->pBt->sec
12230 75 72 65 44 65 6c 65 74 65 3b 0a 20 20 73 71 6c  ureDelete;.  sql
12240 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12250 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d  );.  return b;.}
12260 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
12270 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
12280 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
12290 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
122a0 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a  E_OMIT_VACUUM) *
122b0 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
122c0 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
122d0 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  ' property of th
122e0 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74  e database. If t
122f0 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a  he 'autoVacuum'.
12300 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
12310 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
12320 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
12330 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a  is enabled. If z
12340 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69  ero, it.** is di
12350 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61  sabled. The defa
12360 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
12370 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72  e auto-vacuum pr
12380 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65  operty is .** de
12390 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
123a0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
123b0 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e  UTOVACUUM macro.
123c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
123d0 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75  treeSetAutoVacuu
123e0 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  m(Btree *p, int 
123f0 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66  autoVacuum){.#if
12400 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12410 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
12420 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
12430 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53  NLY;.#else.  BtS
12440 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
12450 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
12460 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20  SQLITE_OK;.  u8 
12470 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63  av = (u8)autoVac
12480 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  uum;..  sqlite3B
12490 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
124a0 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
124b0 65 46 69 78 65 64 20 26 26 20 28 61 76 20 3f 31  eFixed && (av ?1
124c0 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61  :0)!=pBt->autoVa
124d0 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
124e0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
124f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
12500 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
12510 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42   av ?1:0;.    pB
12520 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
12530 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a  av==2 ?1:0;.  }.
12540 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12550 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12560 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
12570 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
12580 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
12590 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
125a0 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
125b0 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
125c0 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
125d0 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
125e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
125f0 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
12600 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
12610 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12620 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
12630 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
12640 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
12650 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
12660 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
12670 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
12680 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
12690 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
126a0 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
126b0 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
126c0 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
126d0 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
126e0 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
126f0 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
12700 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12710 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12720 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
12730 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
12740 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
12750 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
12760 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
12770 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
12780 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
12790 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
127a0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
127b0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
127c0 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
127d0 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
127e0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
127f0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
12800 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
12810 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
12820 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
12830 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
12840 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
12850 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
12860 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
12870 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
12880 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
12890 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
128a0 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
128b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
128c0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
128d0 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
128e0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
128f0 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ge1;     /* Page
12900 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
12910 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
12920 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
12930 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
12940 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
12950 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  base */.  int nP
12960 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f  ageFile = 0;   /
12970 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
12980 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
12990 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
129a0 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20  nPageHeader;    
129b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
129c0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
129d0 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ase according to
129e0 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72   hdr */..  asser
129f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12a00 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
12a10 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
12a20 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
12a30 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
12a40 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
12a50 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
12a60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12a70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
12a80 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
12a90 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
12aa0 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
12ab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
12ac0 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
12ad0 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
12ae0 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
12af0 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
12b00 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
12b10 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
12b20 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
12b30 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
12b40 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
12b50 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
12b60 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
12b70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
12b80 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
12b90 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
12ba0 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
12bb0 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
12bc0 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
12bd0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
12be0 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
12bf0 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
12c00 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20  }.  if( nPage>0 
12c10 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53  ){.    u32 pageS
12c20 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61  ize;.    u32 usa
12c30 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
12c40 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
12c50 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
12c60 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
12c70 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
12c80 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
12c90 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
12ca0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
12cb0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
12cc0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
12cd0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66  _OMIT_WAL.    if
12ce0 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b  ( page1[18]>1 ){
12cf0 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64  .      pBt->read
12d00 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Only = 1;.    }.
12d10 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
12d20 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>1 ){.      got
12d30 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
12d40 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  led;.    }.#else
12d50 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
12d60 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42  8]>2 ){.      pB
12d70 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
12d80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
12d90 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20  age1[19]>2 ){.  
12da0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
12db0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
12dc0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
12dd0 20 77 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69   write version i
12de0 73 20 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73  s set to 2, this
12df0 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
12e00 20 62 65 20 61 63 63 65 73 73 65 64 0a 20 20 20   be accessed.   
12e10 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e   ** in WAL mode.
12e20 20 49 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e   If the log is n
12e30 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  ot already open,
12e40 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68   open it now. Th
12e50 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  en .    ** retur
12e60 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
12e70 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70  return without p
12e80 6f 70 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72  opulating BtShar
12e90 65 64 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a  ed.pPage1..    *
12ea0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74  * The caller det
12eb0 65 63 74 73 20 74 68 69 73 20 61 6e 64 20 63 61  ects this and ca
12ec0 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
12ed0 6e 20 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73  n again. This is
12ee0 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64  .    ** required
12ef0 20 61 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20   as the version 
12f00 6f 66 20 70 61 67 65 20 31 20 63 75 72 72 65 6e  of page 1 curren
12f10 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 31  tly in the page1
12f20 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d   buffer.    ** m
12f30 61 79 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61  ay not be the la
12f40 74 65 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74  test version - t
12f50 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65  here may be a ne
12f60 77 65 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c  wer one in the l
12f70 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a  og.    ** file..
12f80 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
12f90 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 70  age1[19]==2 && p
12fa0 42 74 2d 3e 64 6f 4e 6f 74 55 73 65 57 41 4c 3d  Bt->doNotUseWAL=
12fb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
12fc0 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  isOpen = 0;.    
12fd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
12fe0 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e  gerOpenWal(pBt->
12ff0 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29  pPager, &isOpen)
13000 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
13010 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13020 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
13030 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
13040 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f     }else if( isO
13050 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
13060 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
13070 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72  age1);.        r
13080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
130a0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
130b0 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  B;.    }.#endif.
130c0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
130d0 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61  mum embedded fra
130e0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78  ction must be ex
130f0 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20  actly 25%.  And 
13100 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20  the minimum.    
13110 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61 63  ** embedded frac
13120 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e  tion must be 12.
13130 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66  5% for both leaf
13140 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65  -data and non-le
13150 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20  af-data..    ** 
13160 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
13170 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73  ign allowed thes
13180 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72  e amounts to var
13190 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20  y, but as of.   
131a0 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e   ** version 3.6.
131b0 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68  0, we require th
131c0 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a  em to be fixed..
131d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d      */.    if( m
131e0 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d  emcmp(&page1[21]
131f0 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22  , "\100\040\040"
13200 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,3)!=0 ){.      
13210 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
13220 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
13230 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61    pageSize = (pa
13240 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70  ge1[16]<<8) | (p
13250 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20  age1[17]<<16);. 
13260 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a     if( ((pageSiz
13270 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d  e-1)&pageSize)!=
13280 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69  0.     || pageSi
13290 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
132a0 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c  GE_SIZE .     ||
132b0 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a   pageSize<=256 .
132c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
132d0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
132e0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  led;.    }.    a
132f0 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
13300 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
13310 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
13320 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
13330 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29  ];.    if( (u32)
13340 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
13350 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
13360 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
13370 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
13380 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
13390 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
133a0 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
133b0 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
133c0 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
133d0 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
133e0 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
133f0 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
13400 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
13410 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
13420 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
13430 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
13440 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
13450 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
13460 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
13470 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
13480 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
13490 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
134a0 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
134b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
134c0 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
134d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
134e0 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
134f0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
13500 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
13510 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
13520 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
13530 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
13540 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
13550 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
13560 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13580 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53             pageS
13590 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b  ize-usableSize);
135a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
135b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
135c0 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  (pBt->db->flags 
135d0 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72  & SQLITE_Recover
135e0 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61  yMode)==0 && nPa
135f0 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a  ge>nPageFile ){.
13600 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13610 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
13620 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
13630 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
13640 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62    }.    if( usab
13650 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20  leSize<480 ){.  
13660 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
13670 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
13680 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
13690 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
136a0 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
136b0 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
136c0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
136d0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
136e0 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
136f0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
13700 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
13710 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
13720 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
13730 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
13740 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
13750 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
13760 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
13770 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
13780 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
13790 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
137a0 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
137b0 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
137c0 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
137d0 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
137e0 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
137f0 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
13800 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
13810 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
13820 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
13830 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
13840 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
13850 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
13860 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
13870 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
13880 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
13890 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
138a0 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
138b0 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
138c0 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
138d0 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
138e0 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
138f0 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
13900 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
13910 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
13920 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65  pointer, a heade
13930 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75  r which is as mu
13940 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79  ch as.  ** 17 by
13950 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e  tes long, 0 to N
13960 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
13970 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e  d, and an option
13980 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c  al 4 byte overfl
13990 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69  ow.  ** page poi
139a0 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74  nter..  */.  pBt
139b0 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31  ->maxLocal = (u1
139c0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
139d0 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d  ize-12)*64/255 -
139e0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e   23);.  pBt->min
139f0 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
13a00 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
13a10 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
13a20 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
13a30 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
13a40 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20  bleSize - 35);. 
13a50 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
13a60 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
13a70 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
13a80 35 20 2d 20 32 33 29 3b 0a 20 20 61 73 73 65 72  5 - 23);.  asser
13a90 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  t( pBt->maxLeaf 
13aa0 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f  + 23 <= MX_CELL_
13ab0 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70  SIZE(pBt) );.  p
13ac0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61  Bt->pPage1 = pPa
13ad0 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67  ge1;.  pBt->nPag
13ae0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
13af0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
13b00 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13b10 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
13b20 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d  (pPage1);.  pBt-
13b30 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72  >pPage1 = 0;.  r
13b40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13b50 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
13b60 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
13b70 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
13b80 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
13b90 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
13ba0 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
13bb0 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
13bc0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
13bd0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
13be0 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
13bf0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
13c00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13c10 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
13c20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
13c30 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
13c40 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
13c50 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
13c60 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
13c70 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
13c80 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
13c90 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
13ca0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
13cb0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
13cc0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13cd0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
13ce0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
13cf0 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73  sert( pBt->pCurs
13d00 6f 72 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e  or==0 || pBt->in
13d10 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e  Transaction>TRAN
13d20 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  S_NONE );.  if( 
13d30 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
13d40 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
13d50 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  & pBt->pPage1!=0
13d60 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
13d70 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
13d80 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
13d90 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ( sqlite3PagerRe
13da0 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
13db0 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  er)==1 );.    as
13dc0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
13dd0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
13de0 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d  releasePage(pBt-
13df0 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70 42  >pPage1);.    pB
13e00 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
13e10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70   }.}../*.** If p
13e20 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  Bt points to an 
13e30 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20  empty file then 
13e40 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70  convert that emp
13e50 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20  ty file.** into 
13e60 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61  a new empty data
13e70 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69  base by initiali
13e80 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  zing the first p
13e90 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61  age of.** the da
13ea0 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
13eb0 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
13ec0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
13ed0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
13ee0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
13ef0 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
13f00 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
13f10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13f20 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
13f30 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
13f40 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
13f50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13f60 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
13f70 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge1;.  assert( p
13f80 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20  P1!=0 );.  data 
13f90 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20  = pP1->aData;.  
13fa0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13fb0 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50  rWrite(pP1->pDbP
13fc0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
13fd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
13fe0 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69  mcpy(data, zMagi
13ff0 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  cHeader, sizeof(
14000 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a  zMagicHeader));.
14010 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
14020 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d  (zMagicHeader)==
14030 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d  16 );.  data[16]
14040 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
14050 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29  geSize>>8)&0xff)
14060 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28  ;.  data[17] = (
14070 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
14080 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20  ze>>16)&0xff);. 
14090 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
140a0 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
140b0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
140c0 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70  ableSize<=pBt->p
140d0 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e  ageSize && pBt->
140e0 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d  usableSize+255>=
140f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
14100 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38    data[20] = (u8
14110 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
14120 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
14130 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  e);.  data[21] =
14140 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20   64;.  data[22] 
14150 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d  = 32;.  data[23]
14160 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28   = 32;.  memset(
14170 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30  &data[24], 0, 10
14180 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67  0-24);.  zeroPag
14190 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45  e(pP1, PTF_INTKE
141a0 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c  Y|PTF_LEAF|PTF_L
141b0 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74  EAFDATA );.  pBt
141c0 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
141d0 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
141e0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
141f0 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
14200 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
14210 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
14220 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
14230 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
14240 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
14250 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
14260 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
14270 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
14280 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
14290 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
142a0 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
142b0 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
142c0 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  if.  pBt->nPage 
142d0 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20  = 1;.  data[31] 
142e0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
142f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14300 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
14310 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
14320 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
14330 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
14340 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
14350 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
14360 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
14370 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
14380 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
14390 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
143a0 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
143b0 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
143c0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
143d0 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
143e0 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
143f0 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
14400 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
14410 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
14420 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
14430 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
14440 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
14450 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
14460 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
14470 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
14480 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
14490 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
144a0 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
144b0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
144c0 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
144d0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
144e0 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
144f0 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
14500 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
14510 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
14520 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
14530 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
14540 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
14550 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
14560 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
14570 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
14580 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
14590 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
145a0 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
145b0 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
145c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
145d0 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
145e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
145f0 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
14600 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
14610 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
14620 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
14630 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
14640 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
14650 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
14660 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
14670 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
14680 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
14690 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
146a0 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
146b0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
146c0 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
146d0 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
146e0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
146f0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
14700 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
14710 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
14720 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
14730 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
14740 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
14750 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
14760 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
14770 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
14780 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
14790 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
147a0 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
147b0 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
147c0 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
147d0 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
147e0 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
147f0 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
14800 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
14810 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
14820 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
14830 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
14840 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
14850 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
14860 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
14870 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
14880 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
14890 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
148a0 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
148b0 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
148c0 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
148d0 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
148e0 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
148f0 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
14900 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
14910 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
14920 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
14930 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
14940 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
14950 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
14960 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
14970 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
14980 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
14990 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
149a0 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
149b0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
149c0 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
149d0 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
149e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
149f0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
14a00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
14a10 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
14a20 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
14a30 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
14a40 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
14a50 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
14a60 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
14a70 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
14a80 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
14a90 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
14aa0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
14ab0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
14ac0 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
14ad0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
14ae0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
14af0 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
14b00 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
14b10 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
14b20 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
14b30 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
14b40 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
14b50 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
14b60 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
14b70 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
14b80 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72   */.  if( pBt->r
14b90 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61  eadOnly && wrfla
14ba0 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
14bb0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
14bc0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
14bd0 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
14be0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
14bf0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
14c00 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
14c10 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
14c20 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
14c30 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
14c40 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
14c50 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
14c60 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
14c70 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
14c80 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
14c90 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
14ca0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
14cb0 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61   */.  if( (wrfla
14cc0 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
14cd0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
14ce0 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73  RITE) || pBt->is
14cf0 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70  Pending ){.    p
14d00 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
14d10 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73  iter->db;.  }els
14d20 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
14d30 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49  {.    BtLock *pI
14d40 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  ter;.    for(pIt
14d50 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
14d60 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
14d70 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
14d80 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
14d90 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
14da0 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
14db0 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
14dc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14dd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
14de0 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20  if( pBlock ){.  
14df0 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
14e00 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
14e10 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72  , pBlock);.    r
14e20 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
14e30 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
14e40 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
14e50 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gun;.  }.#endif.
14e60 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
14e70 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
14e80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
14e90 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
14ea0 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
14eb0 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
14ec0 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
14ed0 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
14ee0 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
14ef0 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
14f00 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
14f10 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
14f20 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
14f30 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
14f40 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
14f50 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
14f60 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
14f70 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
14f80 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70  rans_begun;..  p
14f90 42 74 2d 3e 69 6e 69 74 69 61 6c 6c 79 45 6d 70  Bt->initiallyEmp
14fa0 74 79 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 6e  ty = (u8)(pBt->n
14fb0 50 61 67 65 3d 3d 30 29 3b 0a 20 20 64 6f 20 7b  Page==0);.  do {
14fc0 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
14fd0 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
14fe0 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
14ff0 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
15000 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
15010 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
15020 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
15030 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
15040 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
15050 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
15060 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
15070 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
15080 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
15090 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
150a0 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
150b0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
150c0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
150d0 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
150e0 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
150f0 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
15100 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
15110 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
15120 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
15130 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
15140 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
15150 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
15160 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
15170 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
15180 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
15190 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
151a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
151b0 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
151c0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  {.      if( pBt-
151d0 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
151e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
151f0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
15200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15210 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
15220 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
15230 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69  er,wrflag>1,sqli
15240 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
15250 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
15260 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15270 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
15280 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
15290 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pBt);.        }
152a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
152b0 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51   .    if( rc!=SQ
152c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
152d0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
152e0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d  used(pBt);.    }
152f0 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30  .  }while( (rc&0
15300 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53  xFF)==SQLITE_BUS
15310 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  Y && pBt->inTran
15320 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
15330 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  ONE &&.         
15340 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
15350 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a  Handler(pBt) );.
15360 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15370 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
15380 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
15390 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
153a0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
153b0 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  n++;.#ifndef SQL
153c0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
153d0 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20  CACHE.      if( 
153e0 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 09  p->sharable ){..
153f0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e  assert( p->lock.
15400 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e  pBtree==p && p->
15410 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29  lock.iTable==1 )
15420 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
15430 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c  k.eLock = READ_L
15440 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  OCK;.        p->
15450 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74  lock.pNext = pBt
15460 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  ->pLock;.       
15470 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70   pBt->pLock = &p
15480 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ->lock;.      }.
15490 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
154a0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
154b0 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
154c0 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
154d0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
154e0 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
154f0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
15500 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
15510 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
15520 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66     }.    if( wrf
15530 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  lag ){.      Mem
15540 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
15550 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e  Bt->pPage1;.#ifn
15560 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15570 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
15580 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
15590 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
155a0 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d    pBt->pWriter =
155b0 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   p;.      pBt->i
155c0 73 45 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38  sExclusive = (u8
155d0 29 28 77 72 66 6c 61 67 3e 31 29 3b 0a 23 65 6e  )(wrflag>1);.#en
155e0 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
155f0 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
15600 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
15610 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
15620 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
15630 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
15640 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
15650 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15660 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
15670 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
15680 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
15690 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
156a0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
156b0 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
156c0 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
156d0 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
156e0 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
156f0 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
15700 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
15710 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
15720 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
15730 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15740 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15750 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
15760 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
15770 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
15780 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
15790 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
157a0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
157b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
157c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
157d0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
157e0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
157f0 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
15800 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15810 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
15820 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
15830 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15840 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
15850 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
15860 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
15870 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
15880 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
15890 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20   of.    ** open 
158a0 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74  savepoints. If t
158b0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
158c0 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ter is greater t
158d0 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a  han 0 and.    **
158e0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
158f0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
15900 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
15910 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
15920 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
15930 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
15940 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
15950 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d  ->pPager, p->db-
15960 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >nSavepoint);.  
15970 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
15980 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
15990 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
159a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
159b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
159c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
159d0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
159e0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
159f0 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
15a00 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
15a10 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
15a20 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
15a30 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
15a40 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
15a50 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
15a60 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
15a70 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
15a80 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
15a90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
15aa0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
15ab0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
15ac0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ae0 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
15af0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
15b00 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
15b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
15b30 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
15b40 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
15b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
15b70 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
15b80 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
15b90 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73  ge->pBt;.  u8 is
15ba0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
15bb0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
15bc0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
15bd0 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
15be0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15bf0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
15c00 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
15c10 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
15c20 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
15c30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15c40 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
15c50 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d  ptrmaps_out;.  }
15c60 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
15c70 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
15c80 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
15c90 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
15ca0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
15cb0 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
15cc0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
15cd0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
15ce0 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
15cf0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
15d00 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
15d10 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
15d20 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
15d30 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
15d40 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
15d50 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
15d60 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
15d70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
15d80 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
15d90 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
15da0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
15db0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
15dc0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
15dd0 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
15de0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
15df0 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74  , &rc);.  }..set
15e00 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
15e10 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
15e20 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
15e30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15e40 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
15e50 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
15e60 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
15e70 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
15e80 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
15e90 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
15ea0 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
15eb0 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
15ec0 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
15ed0 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
15ee0 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
15ef0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
15f00 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
15f10 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
15f20 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
15f30 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
15f40 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
15f50 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
15f60 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
15f70 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
15f80 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
15f90 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
15fa0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
15fb0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15fd0 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
15fe0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
15ff0 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
16000 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
16010 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
16020 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
16030 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
16040 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
16050 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16060 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
16070 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
16080 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
16090 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
160a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
160b0 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
160c0 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
160d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
160e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
160f0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
16100 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
16110 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
16120 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
16130 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
16140 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
16150 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
16160 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
16170 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
16180 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
16190 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
161a0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
161b0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
161c0 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
161d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
161e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
161f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
16200 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
16210 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
16220 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72  .    u8 isInitOr
16230 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
16240 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
16250 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
16260 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
16270 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65  (pPage);.    nCe
16280 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
16290 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
162a0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
162b0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
162c0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
162d0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
162e0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
162f0 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
16300 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
16310 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50  ;.        btreeP
16320 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
16330 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
16340 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
16350 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20  fo.iOverflow.   
16360 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69        && pCell+i
16370 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c  nfo.iOverflow+3<
16380 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50  =pPage->aData+pP
16390 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20  age->maskPage.  
163a0 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d         && iFrom=
163b0 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
163c0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
163d0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
163e0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
163f0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
16400 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20  rflow], iTo);.  
16410 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16430 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
16440 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
16450 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
16460 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
16470 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
16480 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
164a0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
164b0 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
164c0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
164d0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
164e0 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
164f0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
16500 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
16510 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
16520 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16530 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
16540 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16550 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
16560 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
16570 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
16580 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
16590 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
165a0 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
165b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
165c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
165d0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
165e0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
165f0 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
16600 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
16610 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
16620 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
16630 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
16640 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69  *.** The isCommi
16650 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
16660 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
16670 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
16680 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a  er that.** the j
16690 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
166a0 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
166b0 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
166c0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a   pDbPage->pgno .
166d0 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
166e0 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
166f0 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
16700 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
16710 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61  te to that.** pa
16720 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
16730 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
16740 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
16750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
16760 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
16770 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
16780 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
16790 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
167a0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
167b0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
167c0 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
167d0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
167e0 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
167f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
16800 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
16810 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
16820 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
16830 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
16840 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
16850 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
16860 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
16870 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
16880 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74       /* isCommit
16890 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20   flag passed to 
168a0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
168b0 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  page */.){.  Mem
168c0 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
168d0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
168e0 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
168f0 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
16900 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
16910 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
16920 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
16930 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
16940 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
16950 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
16960 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
16970 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
16980 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
16990 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
169a0 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
169b0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
169c0 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
169d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
169e0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
169f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
16a00 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
16a10 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
16a20 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
16a30 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
16a40 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
16a50 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
16a60 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
16a70 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
16a80 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
16a90 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
16aa0 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
16ab0 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
16ac0 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
16ad0 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
16ae0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
16af0 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
16b00 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
16b10 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
16b20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
16b30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
16b40 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
16b50 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
16b60 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
16b70 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
16b80 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
16b90 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
16ba0 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
16bb0 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
16bc0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
16bd0 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
16be0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
16bf0 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
16c00 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
16c10 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
16c20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
16c30 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
16c40 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
16c50 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
16c60 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
16c70 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
16c80 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
16c90 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
16ca0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
16cb0 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
16cc0 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
16cd0 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
16ce0 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
16cf0 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
16d00 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
16d10 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
16d20 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
16d30 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
16d40 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
16d50 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
16d60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16d70 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
16d80 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
16d90 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
16da0 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
16db0 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
16dc0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
16dd0 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
16de0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
16df0 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
16e00 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
16e10 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
16e20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16e30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
16e40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16e50 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
16e60 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
16e70 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
16e80 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
16e90 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
16ea0 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
16eb0 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
16ec0 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
16ed0 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
16ee0 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
16ef0 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
16f00 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
16f10 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
16f20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
16f30 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
16f40 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
16f50 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
16f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16f70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16f80 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
16f90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
16fa0 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
16fb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
16fc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16fd0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
16fe0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
16ff0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
17000 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
17010 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
17020 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
17030 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
17040 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
17050 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
17060 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17070 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  K ){.      ptrma
17080 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
17090 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
170a0 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
170b0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
170c0 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
170d0 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
170e0 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
170f0 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
17100 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
17110 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
17120 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
17130 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
17140 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
17150 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
17160 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
17170 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
17180 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72  successful,.** r
17190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
171a0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
171b0 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
171c0 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20  therefore no.** 
171d0 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67  point in calling
171e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
171f0 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51  gain), return SQ
17200 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
17210 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79   More specificly
17220 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
17230 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
17240 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20  rganize the .** 
17250 64 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74  database so that
17260 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
17270 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
17280 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69  ntly in use.** i
17290 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75  s no longer in u
172a0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
172b0 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20   nFin parameter 
172c0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69  is non-zero, thi
172d0 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
172e0 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  es.** that the c
172f0 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
17300 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
17310 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a  umStep() until.*
17320 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  * it returns SQL
17330 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65  ITE_DONE or an e
17340 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e  rror, and that n
17350 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75  Fin is the.** nu
17360 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
17370 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17380 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74  will contain aft
17390 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63  er this .** proc
173a0 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e  ess is complete.
173b0 20 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72    If nFin is zer
173c0 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  o, it is assumed
173d0 20 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56 61 63   that.** incrVac
173e0 75 75 6d 53 74 65 70 28 29 20 77 69 6c 6c 20 62  uumStep() will b
173f0 65 20 63 61 6c 6c 65 64 20 61 20 66 69 6e 69 74  e called a finit
17400 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
17410 73 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79 20 6f  s.** which may o
17420 72 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74 79 20  r may not empty 
17430 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 41  the freelist.  A
17440 20 66 75 6c 6c 20 61 75 74 6f 76 61 63 75 75 6d   full autovacuum
17450 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30 2e 20  .** has nFin>0. 
17460 20 41 20 22 50 52 41 47 4d 41 20 69 6e 63 72 65   A "PRAGMA incre
17470 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22 20 68  mental_vacuum" h
17480 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f 0a 73  as nFin==0..*/.s
17490 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
174a0 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
174b0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
174c0 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29  n, Pgno iLastPg)
174d0 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
174e0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
174f0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
17500 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
17510 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ee-list */.  int
17520 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
17530 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17540 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
17550 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73  ;.  assert( iLas
17560 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69  tPg>nFin );..  i
17570 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
17580 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
17590 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
175a0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
175b0 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79  t) ){.    u8 eTy
175c0 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
175d0 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65  rPage;..    nFre
175e0 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65  eList = get4byte
175f0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
17600 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69  Data[36]);.    i
17610 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
17620 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17630 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
17640 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
17650 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
17660 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
17670 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
17680 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17690 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
176a0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
176b0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
176c0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
176d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
176e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
176f0 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
17700 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
17710 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
17720 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nFin==0 ){.     
17730 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
17740 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
17750 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
17760 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
17770 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
17780 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a  if nFin is non-z
17790 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
177a0 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
177b0 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
177c0 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
177d0 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
177e0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
177f0 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
17800 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
17810 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
17820 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
17830 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
17840 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17850 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
17860 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
17870 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
17880 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
17890 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
178a0 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
178b0 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20  , iLastPg, 1);. 
178c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
178d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
178e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
178f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17900 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
17910 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
17920 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
17930 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
17940 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
17950 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
17960 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
17970 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
17980 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
17990 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
179a0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
179b0 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20  stPg;..      rc 
179c0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
179d0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
179e0 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
179f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17a00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
17a10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
17a20 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46  ..      /* If nF
17a30 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  in is zero, this
17a40 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
17a50 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
17a60 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
17a70 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
17a80 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
17a90 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
17aa0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
17ab0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
17ac0 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
17ad0 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20  and, if nFin is 
17ae0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
17af0 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
17b00 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
17b10 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
17b20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
17b30 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
17b40 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
17b50 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
17b60 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
17b70 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
17b80 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
17b90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
17ba0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
17bb0 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
17bc0 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a  iFreePg, 0, 0);.
17bd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
17be0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17bf0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
17c00 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
17c10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17c20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17c30 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
17c40 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
17c50 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20  }while( nFin!=0 
17c60 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
17c70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17c80 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
17c90 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
17ca0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17cb0 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d  erWrite(pLastPg-
17cc0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
17cd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17ce0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
17cf0 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
17d00 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
17d10 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
17d20 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29  FreePg, nFin!=0)
17d30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17d40 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
17d50 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tPg);.      if( 
17d60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17d70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
17d80 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
17d90 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69  }.  }..  if( nFi
17da0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73  n==0 ){.    iLas
17db0 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65  tPg--;.    while
17dc0 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
17dd0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
17de0 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45  )||PTRMAP_ISPAGE
17df0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
17e00 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54 52 4d  {.      if( PTRM
17e10 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
17e20 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
17e30 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 3b     MemPage *pPg;
17e40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
17e50 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
17e60 69 4c 61 73 74 50 67 2c 20 26 70 50 67 2c 20 30  iLastPg, &pPg, 0
17e70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
17e80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17e90 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
17ea0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
17eb0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17ec0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
17ed0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
17ee0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
17ef0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69  (pPg);.        i
17f00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17f10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
17f20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
17f30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
17f40 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
17f50 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
17f60 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
17f70 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61  pBt->pPager, iLa
17f80 73 74 50 67 29 3b 0a 20 20 20 20 70 42 74 2d 3e  stPg);.    pBt->
17f90 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
17fa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
17fb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17fc0 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
17fd0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70  ction must be op
17fe0 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ened before call
17ff0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
18000 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d  n..** It perform
18010 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20  s a single unit 
18020 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20  of work towards 
18030 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
18040 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  acuum..**.** If 
18050 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
18060 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68  vacuum is finish
18070 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ed after this fu
18080 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a  nction has run,.
18090 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  ** SQLITE_DONE i
180a0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
180b0 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65  t is not finishe
180c0 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  d, but no error 
180d0 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c  occurred,.** SQL
180e0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
180f0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e  ed. Otherwise an
18100 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
18110 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  de. .*/.int sqli
18120 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
18130 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  um(Btree *p){.  
18140 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
18150 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
18160 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
18170 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
18180 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
18190 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
181a0 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61  RITE && p->inTra
181b0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
181c0 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61  );.  if( !pBt->a
181d0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
181e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
181f0 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
18200 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
18210 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
18220 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61  .    rc = incrVa
18230 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c  cuumStep(pBt, 0,
18240 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
18250 70 42 74 29 29 3b 0a 20 20 20 20 69 66 28 20 72  pBt));.    if( r
18260 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18270 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18280 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
18290 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
182a0 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
182b0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
182c0 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
182d0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  >nPage);.    }. 
182e0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
182f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
18300 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18310 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
18320 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
18330 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
18340 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73  mit when a trans
18350 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d  action.** is com
18360 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  mited for an aut
18370 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
18380 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
18390 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
183a0 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
183b0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
183c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
183d0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
183e0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
183f0 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
18400 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
18410 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
18420 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
18430 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
18440 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
18450 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
18460 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
18470 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
18480 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
18490 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
184a0 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
184b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
184c0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
184d0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
184e0 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
184f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
18500 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
18510 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
18520 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
18530 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
18540 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
18550 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
18560 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
18570 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
18580 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
18590 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
185a0 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Fin;         /* 
185b0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
185c0 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65  in database afte
185d0 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20  r autovacuuming 
185e0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  */.    Pgno nFre
185f0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  e;        /* Num
18600 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
18610 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69  the freelist ini
18620 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67  tially */.    Pg
18630 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20  no nPtrmap;     
18640 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74   /* Number of Pt
18650 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65  rMap pages to be
18660 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67   freed */.    Pg
18670 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20  no iFree;       
18680 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67   /* The next pag
18690 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  e to be freed */
186a0 0a 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b  .    int nEntry;
186b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
186c0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
186d0 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20  one ptrmap page 
186e0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  */.    Pgno nOri
186f0 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  g;        /* Dat
18700 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72  abase size befor
18710 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20  e freeing */..  
18720 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50    nOrig = btreeP
18730 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
18740 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
18750 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
18760 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49   || nOrig==PENDI
18770 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
18780 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  ) ){.      /* It
18790 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
187a0 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74   to create a dat
187b0 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20  abase for which 
187c0 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20  the final page. 
187d0 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
187e0 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  r a pointer-map 
187f0 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64  page or the pend
18800 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49  ing-byte page. I
18810 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  f one.      ** i
18820 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
18830 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f  his indicates co
18840 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
18850 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
18860 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18870 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
18880 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
18890 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
188a0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e  Data[36]);.    n
188b0 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61  Entry = pBt->usa
188c0 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 20 20 6e  bleSize/5;.    n
188d0 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d  Ptrmap = (nFree-
188e0 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47  nOrig+PTRMAP_PAG
188f0 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b  ENO(pBt, nOrig)+
18900 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a  nEntry)/nEntry;.
18910 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67      nFin = nOrig
18920 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
18930 61 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72 69  ap;.    if( nOri
18940 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
18950 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
18960 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  <PENDING_BYTE_PA
18970 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
18980 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20   nFin--;.    }. 
18990 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
189a0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
189b0 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
189c0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
189d0 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e  t) ){.      nFin
189e0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  --;.    }.    if
189f0 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72  ( nFin>nOrig ) r
18a00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
18a10 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20  RUPT_BKPT;..    
18a20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b  for(iFree=nOrig;
18a30 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72   iFree>nFin && r
18a40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46  c==SQLITE_OK; iF
18a50 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ree--){.      rc
18a60 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
18a70 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72  p(pBt, nFin, iFr
18a80 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ee);.    }.    i
18a90 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  f( (rc==SQLITE_D
18aa0 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ONE || rc==SQLIT
18ab0 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30  E_OK) && nFree>0
18ac0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
18ad0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
18ae0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
18af0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
18b00 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
18b10 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
18b20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
18b30 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
18b40 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
18b50 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
18b60 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
18b70 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20  ta[28], nFin);. 
18b80 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
18b90 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
18ba0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e  Bt->pPager, nFin
18bb0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
18bc0 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  age = nFin;.    
18bd0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
18be0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18bf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
18c00 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
18c10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
18c20 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65  rt( nRef==sqlite
18c30 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
18c40 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
18c50 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20  rn rc;.}..#else 
18c60 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
18c70 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
18c80 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74   */.# define set
18c90 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20  ChildPtrmaps(x) 
18ca0 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
18cb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
18cc0 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
18cd0 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74  rst phase of a t
18ce0 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e  wo-phase commit.
18cf0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
18d00 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62  * causes a rollb
18d10 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  ack journal to b
18d20 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74  e created (if it
18d30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
18d40 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20  y exist).** and 
18d50 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65  populated with e
18d60 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f  nough informatio
18d70 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70  n so that if a p
18d80 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73  ower loss occurs
18d90 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
18da0 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
18db0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
18dc0 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e   state by playin
18dd0 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f  g back.** the jo
18de0 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65  urnal.  Then the
18df0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
18e00 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75   journal are flu
18e10 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74  shed out to.** t
18e20 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20  he disk.  After 
18e30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
18e40 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20  afely on oxide, 
18e50 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
18e60 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61  he.** database a
18e70 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
18e80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18e90 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f  e and flushed to
18ea0 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68   oxide..** At th
18eb0 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61  e end of this ca
18ec0 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ll, the rollback
18ed0 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65   journal still e
18ee0 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  xists on the.** 
18ef0 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20  disk and we are 
18f00 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c  still holding al
18f10 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20  l locks, so the 
18f20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
18f30 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  not.** committed
18f40 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74  .  See sqlite3Bt
18f50 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
18f60 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f  o() for the seco
18f70 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a  nd phase of the.
18f80 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  ** commit proces
18f90 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  s..**.** This ca
18fa0 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ll is a no-op if
18fb0 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
18fc0 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  ction is current
18fd0 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74  ly active on pBt
18fe0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
18ff0 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  e, sync the data
19000 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
19010 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61  e btree pBt. zMa
19020 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  ster points to.*
19030 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
19040 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19050 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
19060 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
19070 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
19080 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  l journal file, 
19090 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69  or is NULL, indi
190a0 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72  cating no master
190b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
190c0 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61  * (single databa
190d0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
190e0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
190f0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
19100 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73  master journal s
19110 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61  hould already ha
19120 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74  ve been.** creat
19130 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ed, populated wi
19140 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  th this journal 
19150 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63  pointer and sync
19160 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
19170 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72  * Once this is r
19180 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72  outine has retur
19190 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68  ned, the only th
191a0 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20  ing required to 
191b0 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72  commit.** the wr
191c0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
191d0 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
191e0 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c  e file is to del
191f0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
19200 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19210 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
19220 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e  ne(Btree *p, con
19230 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
19240 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
19250 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
19260 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
19270 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
19280 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19290 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
192a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
192b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
192c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
192d0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
192e0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
192f0 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
19300 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20  ommit(pBt);.    
19310 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19320 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
19330 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
19340 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
19350 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
19360 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
19370 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19380 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
19390 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d  (pBt->pPager, zM
193a0 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73  aster, 0);.    s
193b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
193c0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
193d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
193e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
193f0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68  called from both
19400 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
19410 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65  eTwo() and Btree
19420 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74  Rollback().** at
19430 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
19440 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
19450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19460 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
19470 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a  tion(Btree *p){.
19480 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
19490 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
194a0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
194b0 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
194c0 0a 0a 20 20 62 74 72 65 65 43 6c 65 61 72 48 61  ..  btreeClearHa
194d0 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
194e0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
194f0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 2d  TRANS_NONE && p-
19500 3e 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43  >db->activeVdbeC
19510 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  nt>1 ){.    /* I
19520 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  f there are othe
19530 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  r active stateme
19540 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  nts that belong 
19550 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
19560 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20  .    ** handle, 
19570 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72  downgrade to a r
19580 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
19590 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20  tion. The other 
195a0 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a  statements.    *
195b0 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  * may still be r
195c0 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
195d0 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20  database.  */.  
195e0 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68    downgradeAllSh
195f0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
19600 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69  cks(p);.    p->i
19610 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52  nTrans = TRANS_R
19620 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
19630 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
19640 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20  le had any kind 
19650 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
19660 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
19670 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  he .    ** trans
19680 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20  action count of 
19690 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
196a0 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
196b0 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20  tion count .    
196c0 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  ** reaches 0, se
196d0 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
196e0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
196f0 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
19700 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20  eIfUnused().    
19710 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69  ** call below wi
19720 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  ll unlock the pa
19730 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ger.  */.    if(
19740 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
19750 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
19760 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
19770 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
19780 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  );.      pBt->nT
19790 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
197a0 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
197b0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
197c0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54          pBt->inT
197d0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
197e0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  NS_NONE;.      }
197f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
19800 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  et the current t
19810 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
19820 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
19830 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20  nd unlock the . 
19840 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74     ** pager if t
19850 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20  his call closed 
19860 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72  the only read or
19870 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
19880 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69  on.  */.    p->i
19890 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
198a0 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ONE;.    unlockB
198b0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
198c0 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
198d0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a  ntegrity(p);.}..
198e0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
198f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
19900 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
19910 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
19920 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
19930 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
19940 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
19950 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
19960 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
19970 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75  itPhaseOne() rou
19980 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
19990 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68  rst phase and sh
199a0 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  ould.** be invok
199b0 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ed prior to call
199c0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
199d0 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  .  The sqlite3Bt
199e0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
199f0 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  e().** routine d
19a00 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20  id all the work 
19a10 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72  of writing infor
19a20 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69  mation out to di
19a30 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20  sk and flushing 
19a40 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
19a50 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65  so that they are
19a60 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68   written onto th
19a70 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20  e disk platter. 
19a80 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75   All this.** rou
19a90 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69  tine has to do i
19aa0 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e  s delete or trun
19ab0 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
19ac0 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a   header in the.*
19ad0 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
19ae0 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61  ournal (which ca
19af0 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
19b00 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
19b10 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b  and.** drop lock
19b20 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  s..**.** Normall
19b30 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  y, if an error o
19b40 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
19b50 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20 61  pager layer is a
19b60 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a  ttempting to .**
19b70 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e   finalize the un
19b80 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  derlying journal
19b90 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63   file, this func
19ba0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
19bb0 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65  error and.** the
19bc0 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
19bd0 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c  l attempt a roll
19be0 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  back. However, i
19bf0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
19c00 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d  ument.** is non-
19c10 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62  zero then this b
19c20 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f  -tree transactio
19c30 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d  n is part of a m
19c40 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72  ulti-file .** tr
19c50 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
19c60 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72 61  is case, the tra
19c70 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
19c80 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74  eady been commit
19c90 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65  ted .** (by dele
19ca0 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ting a master jo
19cb0 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
19cc0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
19cd0 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  ignore this .** 
19ce0 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
19cf0 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20   code. So, even 
19d00 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
19d10 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  rs in the pager 
19d20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20  layer,.** reset 
19d30 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
19d40 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  ts internal stat
19d50 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  e to indicate th
19d60 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20  at the write.** 
19d70 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
19d80 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69  been closed. Thi
19d90 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65 2c  s is quite safe,
19da0 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77 69   as the pager wi
19db0 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73  ll have.** trans
19dc0 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65  itioned to the e
19dd0 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  rror state..**.*
19de0 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
19df0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
19e00 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
19e10 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
19e20 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
19e30 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
19e40 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
19e50 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
19e60 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
19e70 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
19e80 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c  tree *p, int bCl
19e90 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70  eanup){..  if( p
19ea0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
19eb0 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53  _NONE ) return S
19ec0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
19ed0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
19ee0 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
19ef0 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
19f00 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
19f10 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
19f20 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20  on open, commit 
19f30 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
19f40 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  s .  ** transact
19f50 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20  ion and set the 
19f60 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
19f70 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f  TRANS_READ..  */
19f80 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
19f90 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
19fa0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
19fb0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
19fc0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
19fd0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
19fe0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
19ff0 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
1a000 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
1a010 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
1a020 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a030 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
1a040 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
1a050 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a060 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d  _OK && bCleanup=
1a070 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1a080 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1a090 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1a0a0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
1a0b0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1a0c0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1a0d0 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
1a0e0 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
1a0f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1a100 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
1a110 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1a120 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
1a130 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
1a140 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a150 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
1a160 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1a170 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1a180 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
1a190 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1a1a0 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
1a1b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a1c0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1a1d0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1a1e0 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a  PhaseTwo(p, 0);.
1a1f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
1a200 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1a210 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
1a220 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
1a230 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1a240 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73  er of write-curs
1a250 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
1a260 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
1a270 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
1a280 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
1a290 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
1a2a0 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
1a2b0 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
1a2c0 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  defined..**.** F
1a2d0 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
1a2e0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
1a2f0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
1a300 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
1a310 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
1a320 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74   of writing to t
1a330 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61  he databse.  Tha
1a340 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73  t means the curs
1a350 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e  or was.** origin
1a360 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ally opened for 
1a370 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20  writing and the 
1a380 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62  cursor has not b
1a390 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79  e disabled.** by
1a3a0 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74   having its stat
1a3b0 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52  e changed to CUR
1a3c0 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74  SOR_FAULT..*/.st
1a3d0 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72  atic int countWr
1a3e0 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61  iteCursors(BtSha
1a3f0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
1a400 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
1a410 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
1a420 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
1a430 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
1a440 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
1a450 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  if( pCur->wrFlag
1a460 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
1a470 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
1a480 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
1a490 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
1a4a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1a4b0 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
1a4c0 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
1a4d0 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
1a4e0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
1a4f0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
1a500 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64  rsor on BtShared
1a510 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
1a520 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
1a530 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
1a540 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  s tripped, inclu
1a550 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61  ding cursors tha
1a560 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f  t belong.** to o
1a570 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1a580 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
1a590 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72  appen to be shar
1a5a0 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ing.** the cache
1a5b0 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
1a5c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1a5d0 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
1a5e0 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
1a5f0 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  urs..** All curs
1a600 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61  ors using the sa
1a610 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  me cache must be
1a620 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70   tripped.** to p
1a630 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
1a640 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
1a650 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a  he btree after.*
1a660 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  * the rollback. 
1a670 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
1a680 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74  y have deleted t
1a690 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65  ables.** or move
1a6a0 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f  d root pages, so
1a6b0 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
1a6c0 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65  cient to.** save
1a6d0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
1a6e0 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63  e cursor.  The c
1a6f0 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  ursor must be.**
1a700 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
1a710 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1a720 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1a730 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
1a740 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20  int errCode){.  
1a750 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73  BtCursor *p;.  s
1a760 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1a770 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
1a780 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
1a790 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1a7a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
1a7b0 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  i;.    sqlite3Bt
1a7c0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1a7d0 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65  );.    p->eState
1a7e0 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
1a7f0 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74  .    p->skipNext
1a800 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
1a810 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69  for(i=0; i<=p->i
1a820 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1a830 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
1a840 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
1a850 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
1a860 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
1a870 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a880 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f  ve(pBtree);.}../
1a890 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
1a8a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
1a8b0 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
1a8c0 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
1a8d0 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
1a8e0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
1a8f0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1a900 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
1a910 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
1a920 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1a930 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
1a940 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
1a950 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
1a960 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
1a970 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1a980 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1a990 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1a9a0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1a9b0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
1a9c0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
1a9d0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
1a9e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a9f0 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
1aa00 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
1aa10 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1aa20 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
1aa30 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73  ge *pPage1;..  s
1aa40 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1aa50 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61 76 65  (p);.  rc = save
1aa60 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
1aa70 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  0, 0);.#ifndef S
1aa80 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1aa90 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63  D_CACHE.  if( rc
1aaa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1aab0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
1aac0 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69  horrible situati
1aad0 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c  on. An IO or mal
1aae0 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
1aaf0 72 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20  rred whilst.    
1ab00 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76  ** trying to sav
1ab10 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
1ab20 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61  ns. If this is a
1ab30 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c  n automatic roll
1ab40 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20  back (as.    ** 
1ab50 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20  the result of a 
1ab60 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c  constraint, mall
1ab70 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20  oc() failure or 
1ab80 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a  IO error) then .
1ab90 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65      ** the cache
1aba0 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c   may be internal
1abb0 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
1abc0 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c  (not contain val
1abd0 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20  id trees) so.   
1abe0 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69   ** we cannot si
1abf0 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  mply return the 
1ac00 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c  error to the cal
1ac10 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62  ler. Instead, ab
1ac20 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  ort .    ** all 
1ac30 71 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79  queries that may
1ac40 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66   be using any of
1ac50 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
1ac60 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65  t failed to save
1ac70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
1ac80 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
1ac90 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a  Cursors(p, rc);.
1aca0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72    }.#endif.  btr
1acb0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1acc0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1acd0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1ace0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
1acf0 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e      assert( TRAN
1ad00 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e  S_WRITE==pBt->in
1ad10 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
1ad20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
1ad30 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42  PagerRollback(pB
1ad40 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1ad50 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
1ad60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
1ad70 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
1ad80 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b   /* The rollback
1ad90 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f   may have destro
1ada0 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e  yed the pPage1->
1adb0 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f  aData value.  So
1adc0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72  .    ** call btr
1add0 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
1ade0 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
1adf0 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
1ae00 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
1ae10 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
1ae20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65  */.    if( btree
1ae30 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
1ae40 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c  &pPage1, 0)==SQL
1ae50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ae60 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34  int nPage = get4
1ae70 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61  byte(28+(u8*)pPa
1ae80 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ge1->aData);.   
1ae90 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61     testcase( nPa
1aea0 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ge==0 );.      i
1aeb0 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71  f( nPage==0 ) sq
1aec0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1aed0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
1aee0 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
1aef0 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e  testcase( pBt->n
1af00 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20  Page!=nPage );. 
1af10 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
1af20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72  = nPage;.      r
1af30 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1af40 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
1af50 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65  sert( countWrite
1af60 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20  Cursors(pBt)==0 
1af70 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
1af80 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1af90 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62  S_READ;.  }..  b
1afa0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
1afb0 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
1afc0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1afd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1afe0 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
1aff0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
1b000 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
1b010 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 63 61  ansaction can ca
1b020 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n be rolled.** b
1b030 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
1b040 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y of the main tr
1b050 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d  ansaction. You m
1b060 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
1b070 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f  saction .** befo
1b080 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
1b090 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
1b0a0 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
1b0b0 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61   is ended automa
1b0c0 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74  tically .** if t
1b0d0 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
1b0e0 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  ion commits or r
1b0f0 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
1b100 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   Statement subtr
1b110 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75  ansactions are u
1b120 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76  sed around indiv
1b130 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  idual SQL statem
1b140 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ents.** that are
1b150 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
1b160 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d  n a BEGIN...COMM
1b170 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20  IT block.  If a 
1b180 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72  constraint.** er
1b190 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
1b1a0 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
1b1b0 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
1b1c0 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e  hat one statemen
1b1d0 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  t.** can be roll
1b1e0 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ed back without 
1b1f0 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  having to rollba
1b200 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  ck the entire tr
1b210 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1b220 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   A statement sub
1b230 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
1b240 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
1b250 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  n anonymous save
1b260 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61  point. The.** va
1b270 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
1b280 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1b290 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  er is the total 
1b2a0 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
1b2b0 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  ints,.** includi
1b2c0 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79  ng the new anony
1b2d0 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20  mous savepoint, 
1b2e0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72  open on the B-Tr
1b2f0 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72  ee. i.e. if ther
1b300 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1b310 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
1b320 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65  d no other state
1b330 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
1b340 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74  s open,.** iStat
1b350 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73  ement is 1. This
1b360 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
1b370 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65  oint can be rele
1b380 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  ased or rolled b
1b390 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ack.** using the
1b3a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
1b3b0 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f  epoint() functio
1b3c0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1b3d0 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28  3BtreeBeginStmt(
1b3e0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53  Btree *p, int iS
1b3f0 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74  tatement){.  int
1b400 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
1b410 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1b420 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1b430 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
1b440 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1b450 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
1b460 73 65 72 74 28 20 70 42 74 2d 3e 72 65 61 64 4f  sert( pBt->readO
1b470 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  nly==0 );.  asse
1b480 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30  rt( iStatement>0
1b490 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1b4a0 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e  tatement>p->db->
1b4b0 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  nSavepoint );.  
1b4c0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1b4d0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1b4e0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20  S_WRITE );.  /* 
1b4f0 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76  At the pager lev
1b500 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  el, a statement 
1b510 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1b520 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a   savepoint with.
1b530 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72    ** an index gr
1b540 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  eater than all s
1b550 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65  avepoints create
1b560 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69  d explicitly usi
1b570 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  ng.  ** SQL stat
1b580 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c  ements. It is il
1b590 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72  legal to open, r
1b5a0 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
1b5b0 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68  ck any.  ** such
1b5c0 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c   savepoints whil
1b5d0 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
1b5e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
1b5f0 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e  point is active.
1b600 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
1b610 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
1b620 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1b630 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b  er, iStatement);
1b640 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1b650 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1b660 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1b670 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1b680 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
1b690 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61  ion, op, is alwa
1b6a0 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ys SAVEPOINT_ROL
1b6b0 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45  LBACK.** or SAVE
1b6c0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54  POINT_RELEASE. T
1b6d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74  his function eit
1b6e0 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20  her releases or 
1b6f0 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a  rolls back the.*
1b700 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e  * savepoint iden
1b710 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
1b720 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20  ter iSavepoint, 
1b730 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
1b740 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70   value .** of op
1b750 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
1b760 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  , iSavepoint is 
1b770 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1b780 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48  equal to zero. H
1b790 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73  owever, if op is
1b7a0 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  .** SAVEPOINT_RO
1b7b0 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61  LLBACK, then iSa
1b7c0 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f  vepoint may also
1b7d0 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20   be -1. In this 
1b7e0 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  case the .** con
1b7f0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74  tents of the ent
1b800 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
1b810 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  are rolled back.
1b820 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
1b830 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72  nt.** from a nor
1b840 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mal transaction 
1b850 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20  rollback, as no 
1b860 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73  locks are releas
1b870 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72  ed and the.** tr
1b880 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e  ansaction remain
1b890 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  s open..*/.int s
1b8a0 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
1b8b0 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  oint(Btree *p, i
1b8c0 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65  nt op, int iSave
1b8d0 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
1b8e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b8f0 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72  if( p && p->inTr
1b900 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1b910 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
1b920 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1b930 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
1b940 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1b950 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
1b960 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
1b970 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65     assert( iSave
1b980 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61  point>=0 || (iSa
1b990 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f  vepoint==-1 && o
1b9a0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1b9b0 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71  LBACK) );.    sq
1b9c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1b9d0 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  p);.    rc = sql
1b9e0 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
1b9f0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1ba00 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
1ba10 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1ba20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ba30 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30  if( iSavepoint<0
1ba40 20 26 26 20 70 42 74 2d 3e 69 6e 69 74 69 61 6c   && pBt->initial
1ba50 6c 79 45 6d 70 74 79 20 29 20 70 42 74 2d 3e 6e  lyEmpty ) pBt->n
1ba60 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
1ba70 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1ba80 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
1ba90 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
1baa0 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
1bab0 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
1bac0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1bad0 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
1bae0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
1baf0 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
1bb00 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
1bb10 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
1bb20 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
1bb30 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1bb40 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
1bb50 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
1bb60 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
1bb70 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1bb80 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
1bb90 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1bba0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1bbb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bbc0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1bbd0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1bbe0 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
1bbf0 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
1bc00 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
1bc10 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
1bc20 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
1bc30 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1bc40 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
1bc50 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
1bc60 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
1bc70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1bc80 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
1bc90 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
1bca0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
1bcb0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1bcc0 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
1bcd0 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
1bce0 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
1bcf0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1bd00 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
1bd10 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
1bd20 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
1bd30 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
1bd40 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
1bd50 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1bd60 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
1bd70 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
1bd80 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
1bd90 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
1bda0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
1bdb0 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
1bdc0 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
1bdd0 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
1bde0 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
1bdf0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
1be00 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
1be10 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
1be20 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
1be30 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
1be40 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
1be50 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
1be60 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1be70 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
1be80 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
1be90 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
1bea0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
1beb0 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
1bec0 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
1bed0 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
1bee0 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
1bef0 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
1bf00 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
1bf10 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
1bf20 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
1bf30 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
1bf40 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
1bf50 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
1bf60 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
1bf70 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
1bf80 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
1bf90 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
1bfa0 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
1bfb0 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
1bfc0 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
1bfd0 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
1bfe0 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
1bff0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1c000 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
1c010 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
1c020 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
1c030 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
1c040 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
1c050 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
1c060 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
1c070 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
1c080 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
1c090 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1c0a0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
1c0b0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
1c0c0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1c0d0 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
1c0e0 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
1c0f0 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
1c100 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
1c110 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
1c120 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1c130 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c140 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
1c150 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
1c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c170 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
1c180 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
1c190 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c1b0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1c1c0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1c1d0 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1f0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1c200 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1c210 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1c220 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1c230 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1c240 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1c250 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1c260 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
1c270 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1c280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c290 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
1c2a0 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
1c2b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1c2c0 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
1c2d0 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1c2e0 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
1c2f0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
1c300 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1c310 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1c320 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1c330 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20   wrFlag==1 );.. 
1c340 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1c350 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
1c360 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
1c370 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
1c380 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
1c390 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
1c3a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
1c3b0 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
1c3c0 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
1c3d0 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
1c3e0 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
1c3f0 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
1c400 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
1c410 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
1c420 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
1c430 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
1c440 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1c450 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
1c460 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61  eyInfo!=0, wrFla
1c470 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  g+1) );.  assert
1c480 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
1c490 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
1c4a0 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
1c4b0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
1c4c0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1c4d0 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
1c4e0 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
1c4f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
1c500 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1c510 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
1c520 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
1c530 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1c540 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1c550 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
1c560 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
1c570 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e  Data );..  if( N
1c580 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 70  EVER(wrFlag && p
1c590 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  Bt->readOnly) ){
1c5a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1c5b0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
1c5c0 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
1c5d0 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75   && btreePagecou
1c5e0 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  nt(pBt)==0 ){.  
1c5f0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1c600 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c  ==0 );.    iTabl
1c610 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e = 0;.  }..  /*
1c620 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
1c630 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
1c640 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
1c650 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
1c660 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
1c670 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20  es and link the 
1c680 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
1c690 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20  BtShared list.  
1c6a0 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52  */.  pCur->pgnoR
1c6b0 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
1c6c0 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  le;.  pCur->iPag
1c6d0 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e  e = -1;.  pCur->
1c6e0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1c6f0 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
1c700 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
1c710 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
1c720 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38  ur->wrFlag = (u8
1c730 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d  )wrFlag;.  pCur-
1c740 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
1c750 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
1c760 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
1c770 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
1c780 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
1c790 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
1c7a0 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
1c7b0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1c7c0 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63  VALID;.  pCur->c
1c7d0 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a  achedRowid = 0;.
1c7e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c7f0 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
1c800 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
1c810 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
1c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c840 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
1c850 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
1c880 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
1c890 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1c8a0 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8c0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1c8d0 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1c8e0 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1c8f0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1c900 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1c910 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
1c920 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
1c930 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
1c940 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
1c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c960 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
1c970 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
1c980 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1c990 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1c9a0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75  ;.  rc = btreeCu
1c9b0 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
1c9c0 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
1c9d0 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74  , pCur);.  sqlit
1c9e0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1c9f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ca00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1ca10 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75  e size of a BtCu
1ca20 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62  rsor object in b
1ca30 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ytes..**.** This
1ca40 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
1ca50 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73  eeded so that us
1ca60 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ers of cursors c
1ca70 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a  an preallocate.*
1ca80 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f  * sufficient sto
1ca90 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63  rage to hold a c
1caa0 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75  ursor.  The BtCu
1cab0 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  rsor object is o
1cac0 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72  paque.** to user
1cad0 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74  s so they cannot
1cae0 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29   do the sizeof()
1caf0 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68   themselves - th
1cb00 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20  ey must call.** 
1cb10 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
1cb20 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1cb30 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64  eCursorSize(void
1cb40 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e  ){.  return ROUN
1cb50 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73  D8(sizeof(BtCurs
1cb60 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  or));.}../*.** I
1cb70 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
1cb80 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f   that will be co
1cb90 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42  nverted into a B
1cba0 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a  tCursor object..
1cbb0 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65  **.** The simple
1cbc0 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20 77   approach here w
1cbd0 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65  ould be to memse
1cbe0 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f  t() the entire o
1cbf0 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f  bject.** to zero
1cc00 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73 20  .  But it turns 
1cc10 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70 50  out that the apP
1cc20 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b  age[] and aiIdx[
1cc30 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e  ] arrays.** do n
1cc40 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65  ot need to be ze
1cc50 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61 72  roed and they ar
1cc60 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63  e large, so we c
1cc70 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a  an save a lot.**
1cc80 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20   of run-time by 
1cc90 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69  skipping the ini
1cca0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74  tialization of t
1ccb0 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a  hose elements..*
1ccc0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
1ccd0 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74  reeCursorZero(Bt
1cce0 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65  Cursor *p){.  me
1ccf0 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65  mset(p, 0, offse
1cd00 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50  tof(BtCursor, iP
1cd10 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  age));.}../*.** 
1cd20 53 65 74 20 74 68 65 20 63 61 63 68 65 64 20 72  Set the cached r
1cd30 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65 76  owid value of ev
1cd40 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74 68  ery cursor in th
1cd50 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
1cd60 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72 20  file.** as pCur 
1cd70 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20 73  and having the s
1cd80 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  ame root page nu
1cd90 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20 20 54  mber as pCur.  T
1cda0 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73  he value is.** s
1cdb0 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a  et to iRowid..**
1cdc0 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69 76  .** Only positiv
1cdd0 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20 61  e rowid values a
1cde0 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76 61  re considered va
1cdf0 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63 61 63  lid for this cac
1ce00 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68 65  he..** The cache
1ce10 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
1ce20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61 74  to zero, indicat
1ce30 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20 63  ing an invalid c
1ce40 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65 65  ache..** A btree
1ce50 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 20   will work fine 
1ce60 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65 67  with zero or neg
1ce70 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20 57  ative rowids.  W
1ce80 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a  e just cannot.**
1ce90 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20 6e   cache zero or n
1cea0 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c 20  egative rowids, 
1ceb0 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62 6c  which means tabl
1cec0 65 73 20 74 68 61 74 20 75 73 65 20 7a 65 72 6f  es that use zero
1ced0 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65 20   or.** negative 
1cee0 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75 6e  rowids might run
1cef0 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
1cf00 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63 74 69  .  But in practi
1cf10 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e  ce, zero.** or n
1cf20 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 61  egative rowids a
1cf30 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e  re very uncommon
1cf40 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20   so this should 
1cf50 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  not be a problem
1cf60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1cf70 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64 52  3BtreeSetCachedR
1cf80 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  owid(BtCursor *p
1cf90 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  Cur, sqlite3_int
1cfa0 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42 74  64 iRowid){.  Bt
1cfb0 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72  Cursor *p;.  for
1cfc0 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70 43  (p=pCur->pBt->pC
1cfd0 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
1cfe0 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1cff0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72  ->pgnoRoot==pCur
1d000 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e  ->pgnoRoot ) p->
1d010 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69 52  cachedRowid = iR
1d020 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65  owid;.  }.  asse
1d030 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65 64  rt( pCur->cached
1d040 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29 3b  Rowid==iRowid );
1d050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1d060 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69   the cached rowi
1d070 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  d for the given 
1d080 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61 74  cursor.  A negat
1d090 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72  ive or zero.** r
1d0a0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
1d0b0 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 72  cates that the r
1d0c0 6f 77 69 64 20 63 61 63 68 65 20 69 73 20 69 6e  owid cache is in
1d0d0 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64  valid and should
1d0e0 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   be.** ignored. 
1d0f0 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 63 61   If the rowid ca
1d100 63 68 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  che has never be
1d110 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20 74  fore been set, t
1d120 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69 73  hen a.** zero is
1d130 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71   returned..*/.sq
1d140 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
1d150 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68 65  te3BtreeGetCache
1d160 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  dRowid(BtCursor 
1d170 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
1d180 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77   pCur->cachedRow
1d190 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  id;.}../*.** Clo
1d1a0 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
1d1b0 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
1d1c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d1d0 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
1d1e0 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
1d1f0 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
1d200 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1d210 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
1d220 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1d230 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
1d240 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
1d250 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
1d260 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
1d270 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1d280 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  Cur->pBt;.    sq
1d290 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1d2a0 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c  pBtree);.    sql
1d2b0 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
1d2c0 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20  rsor(pCur);.    
1d2d0 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20  if( pCur->pPrev 
1d2e0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ){.      pCur->p
1d2f0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
1d300 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
1d310 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d  else{.      pBt-
1d320 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
1d330 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
1d340 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
1d350 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
1d360 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1d370 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20  pCur->pPrev;.   
1d380 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
1d390 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
1d3a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
1d3b0 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
1d3c0 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
1d3d0 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
1d3e0 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
1d3f0 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
1d400 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
1d410 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
1d420 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20  free(pCur); */. 
1d430 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1d440 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
1d450 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1d460 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
1d470 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
1d480 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
1d490 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
1d4a0 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
1d4b0 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
1d4c0 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
1d4d0 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
1d4e0 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50  , call.** btreeP
1d4f0 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
1d500 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
1d510 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
1d520 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
1d530 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
1d540 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
1d550 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
1d560 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
1d570 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
1d580 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
1d590 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37  ll()..**.** 2007
1d5a0 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69  -06-25:  There i
1d5b0 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20  s a bug in some 
1d5c0 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43  versions of MSVC
1d5d0 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a   that cause the.
1d5e0 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63  ** compiler to c
1d5f0 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c  rash when getCel
1d600 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65  lInfo() is imple
1d610 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72  mented as a macr
1d620 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20  o..** But there 
1d630 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65  is a measureable
1d640 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65   speed advantage
1d650 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61   to using the ma
1d660 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77  cro on gcc.** (w
1d670 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65  hen less compile
1d680 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
1d690 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20  like -Os or -O0 
1d6a0 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65  are used and the
1d6b0 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20  .** compiler is 
1d6c0 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73  not doing agress
1d6d0 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20  ive inlining.)  
1d6e0 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c  So we use a real
1d6f0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
1d700 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72   MSVC and a macr
1d710 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67  o for everything
1d720 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23   else.  Ticket #
1d730 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  2457..*/.#ifndef
1d740 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
1d750 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
1d760 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
1d770 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
1d780 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  fo info;.    int
1d790 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1d7a0 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Page;.    memset
1d7b0 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
1d7c0 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74  f(info));.    bt
1d7d0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1d7e0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1d7f0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  , pCur->aiIdx[iP
1d800 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  age], &info);.  
1d810 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70    assert( memcmp
1d820 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
1d830 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
1d840 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
1d850 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
1d860 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
1d870 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53  endif.#ifdef _MS
1d880 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61  C_VER.  /* Use a
1d890 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69   real function i
1d8a0 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61  n MSVC to work a
1d8b0 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68  round bugs in th
1d8c0 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a  at compiler. */.
1d8d0 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65    static void ge
1d8e0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
1d8f0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69  or *pCur){.    i
1d900 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
1d910 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
1d920 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
1d930 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 62  ->iPage;.      b
1d940 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1d950 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1d960 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
1d970 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
1d980 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76  );.      pCur->v
1d990 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20  alidNKey = 1;.  
1d9a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
1d9b0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
1d9c0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ur);.    }.  }.#
1d9d0 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f  else /* if not _
1d9e0 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20  MSC_VER */.  /* 
1d9f0 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61  Use a macro in a
1da00 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65  ll other compile
1da10 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  rs so that the f
1da20 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e  unction is inlin
1da30 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  ed */.#define ge
1da40 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20  tCellInfo(pCur) 
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da80 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75       \.  if( pCu
1da90 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
1daa0 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dad0 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20        \.    int 
1dae0 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
1daf0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72         \.    btr
1db30 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1db40 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1db50 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
1db60 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
1db70 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c   \.    pCur->val
1db80 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20  idNKey = 1;     
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbc0 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20    \.  }else{    
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc10 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43     \.    assertC
1dc20 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20  ellInfo(pCur);  
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66      \.  }.#endif
1dc70 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a   /* _MSC_VER */.
1dc80 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
1dc90 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75   /* The next rou
1dca0 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77  tine used only w
1dcb0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
1dcc0 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a  tatements */./*.
1dcd0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1dce0 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75  f the given BtCu
1dcf0 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
1dd00 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69  A valid cursor i
1dd10 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73  s one.** that is
1dd20 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1dd30 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20  ing to a row in 
1dd40 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61  a (non-empty) ta
1dd50 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ble..** This is 
1dd60 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72  a verification r
1dd70 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
1dd80 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
1dd90 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
1dda0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ddb0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
1ddc0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1ddd0 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20  {.  return pCur 
1dde0 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
1ddf0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
1de00 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55  .#endif /* NDEBU
1de10 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  G */../*.** Set 
1de20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
1de30 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
1de40 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
1de50 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
1de60 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
1de70 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
1de80 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
1de90 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
1dea0 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
1deb0 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
1dec0 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
1ded0 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
1dee0 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
1def0 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
1df00 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
1df10 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
1df20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1df30 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
1df40 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1df50 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74   must position t
1df60 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20  he cursor prior 
1df70 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
1df80 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a   routine..** .**
1df90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
1dfa0 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61  nnot fail.  It a
1dfb0 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
1dfc0 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e  LITE_OK.  .*/.in
1dfd0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
1dfe0 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
1dff0 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
1e000 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1e010 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1e020 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1e030 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1e040 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
1e050 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1e060 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1e070 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1e080 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
1e090 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  ){.    *pSize = 
1e0a0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1e0b0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1e0c0 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  );.    *pSize = 
1e0d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
1e0e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1e0f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1e100 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
1e110 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1e120 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74  tes of data in t
1e130 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20  he entry the.** 
1e140 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79  cursor currently
1e150 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a   points to..**.*
1e160 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
1e170 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  t guarantee that
1e180 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
1e190 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e  ointing to a non
1e1a0 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65  -NULL.** valid e
1e1b0 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20  ntry.  In other 
1e1c0 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69  words, the calli
1e1d0 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73  ng procedure mus
1e1e0 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74  t guarantee.** t
1e1f0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
1e200 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65  as Cursor.eState
1e210 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  ==CURSOR_VALID..
1e220 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73  **.** Failure is
1e230 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20   not possible.  
1e240 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
1e250 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
1e260 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69  ITE_OK..** It mi
1e270 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c  ght just as well
1e280 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20   be a procedure 
1e290 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29  (returning void)
1e2a0 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65   but we continue
1e2b0 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  .** to return an
1e2c0 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20   integer result 
1e2d0 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69  code for histori
1e2e0 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a  cal reasons..*/.
1e2f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1e300 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f  DataSize(BtCurso
1e310 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53  r *pCur, u32 *pS
1e320 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
1e330 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1e340 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1e350 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1e360 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1e370 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
1e380 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20  pCur);.  *pSize 
1e390 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  = pCur->info.nDa
1e3a0 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ta;.  return SQL
1e3b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1e3c0 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20   Given the page 
1e3d0 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65  number of an ove
1e3e0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1e3f0 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61  e database (para
1e400 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20  meter.** ovfl), 
1e410 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  this function fi
1e420 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nds the page num
1e430 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
1e440 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
1e450 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f  linked list of o
1e460 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
1e470 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75  f possible, it u
1e480 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ses the auto-vac
1e490 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d  uum.** pointer-m
1e4a0 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20  ap data instead 
1e4b0 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63  of reading the c
1e4c0 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f  ontent of page o
1e4d0 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a  vfl to do so. .*
1e4e0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1e4f0 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74   occurs an SQLit
1e500 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1e510 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1e520 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ise:.**.** The p
1e530 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
1e540 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  e next overflow 
1e550 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
1e560 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77  ed list is .** w
1e570 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f  ritten to *pPgno
1e580 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76  Next. If page ov
1e590 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  fl is the last p
1e5a0 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65  age in its linke
1e5b0 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67  d .** list, *pPg
1e5c0 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f  noNext is set to
1e5d0 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   zero. .**.** If
1e5e0 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e   ppPage is not N
1e5f0 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72  ULL, and a refer
1e600 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50  ence to the MemP
1e610 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65  age object corre
1e620 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
1e630 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c  age number pOvfl
1e640 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74   was obtained, t
1e650 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73  hen *ppPage is s
1e660 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
1e670 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  hat.** reference
1e680 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
1e690 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
1e6a0 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c  e caller to call
1e6b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a   releasePage().*
1e6c0 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20  * on *ppPage to 
1e6d0 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e  free the referen
1e6e0 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65  ce. In no refere
1e6f0 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64  nce was obtained
1e700 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
1e710 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73   pointer-map was
1e720 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20   used to obtain 
1e730 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70  the value for *p
1e740 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a  PgnoNext), then.
1e750 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  ** *ppPage is se
1e760 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  t to zero..*/.st
1e770 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72  atic int getOver
1e780 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68  flowPage(.  BtSh
1e790 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
1e7a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e7b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1e7c0 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20  .  Pgno ovfl,   
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7e0 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66  /* Current overf
1e7f0 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
1e800 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
1e810 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
1e820 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67    /* OUT: MemPag
1e830 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65  e handle (may be
1e840 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f   NULL) */.  Pgno
1e850 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20   *pPgnoNext     
1e860 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1e870 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   Next overflow p
1e880 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
1e890 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30  .  Pgno next = 0
1e8a0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1e8b0 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ge = 0;.  int rc
1e8c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1e8d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1e8e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1e8f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1e900 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a  ert(pPgnoNext);.
1e910 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e920 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1e930 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
1e940 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1e950 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  n the overflow l
1e960 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  ist using the.  
1e970 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f  ** autovacuum po
1e980 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
1e990 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20   Guess that the 
1e9a0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20  next page in .  
1e9b0 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
1e9c0 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d  list is page num
1e9d0 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66  ber (ovfl+1). If
1e9e0 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e   that guess turn
1e9f0 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  s .  ** out to b
1ea00 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61  e wrong, fall ba
1ea10 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68  ck to loading th
1ea20 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a  e data of page .
1ea30 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c    ** number ovfl
1ea40 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1ea50 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62  e next page numb
1ea60 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
1ea70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1ea80 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
1ea90 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73  .    Pgno iGuess
1eaa0 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75   = ovfl+1;.    u
1eab0 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68  8 eType;..    wh
1eac0 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
1ead0 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20  GE(pBt, iGuess) 
1eae0 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49  || iGuess==PENDI
1eaf0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1eb00 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73  ) ){.      iGues
1eb10 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s++;.    }..    
1eb20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65  if( iGuess<=btre
1eb30 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
1eb40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
1eb50 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75  rmapGet(pBt, iGu
1eb60 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67  ess, &eType, &pg
1eb70 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
1eb80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1eb90 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1eba0 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d  ERFLOW2 && pgno=
1ebb0 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20  =ovfl ){.       
1ebc0 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a   next = iGuess;.
1ebd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1ebe0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
1ebf0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
1ec00 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65  if..  assert( ne
1ec10 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  xt==0 || rc==SQL
1ec20 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  ITE_DONE );.  if
1ec30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ec40 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
1ec50 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76  eGetPage(pBt, ov
1ec60 66 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a  fl, &pPage, 0);.
1ec70 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1ec80 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
1ec90 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ge==0 );.    if(
1eca0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ecb0 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
1ecc0 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
1ecd0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1ece0 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  ..  *pPgnoNext =
1ecf0 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50   next;.  if( ppP
1ed00 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  age ){.    *ppPa
1ed10 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65  ge = pPage;.  }e
1ed20 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
1ed30 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
1ed40 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
1ed50 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c  QLITE_DONE ? SQL
1ed60 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a  ITE_OK : rc);.}.
1ed70 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
1ed80 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
1ed90 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
1eda0 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
1edb0 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
1edc0 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
1edd0 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
1ede0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
1edf0 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
1ee00 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
1ee10 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
1ee20 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
1ee30 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
1ee40 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
1ee50 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
1ee60 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
1ee70 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
1ee80 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
1ee90 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
1eea0 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
1eeb0 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
1eec0 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
1eed0 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
1eee0 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
1eef0 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
1ef00 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1ef10 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
1ef20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
1ef30 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
1ef40 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
1ef50 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
1ef60 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
1ef70 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
1ef80 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
1ef90 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
1efa0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1efb0 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
1efc0 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
1efd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1efe0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
1eff0 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
1f000 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
1f010 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
1f020 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
1f030 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
1f040 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
1f050 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
1f060 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
1f070 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
1f080 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
1f090 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
1f0a0 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
1f0b0 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
1f0c0 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
1f0d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f0e0 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
1f0f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1f100 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f110 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f120 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
1f130 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
1f140 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
1f150 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
1f160 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
1f170 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
1f180 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
1f190 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
1f1a0 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
1f1b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f1c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
1f1d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1f1e0 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
1f1f0 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
1f200 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
1f210 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
1f220 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
1f230 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1f240 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20  . If the eOp.** 
1f250 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20  parameter is 0, 
1f260 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
1f270 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63  peration (data c
1f280 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75  opied into.** bu
1f290 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20 69  ffer pBuf). If i
1f2a0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61  t is non-zero, a
1f2b0 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f 70   write (data cop
1f2c0 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66  ied from.** buff
1f2d0 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20  er pBuf)..**.** 
1f2e0 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
1f2f0 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
1f300 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
1f310 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
1f320 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
1f330 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
1f340 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
1f350 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  .** The content 
1f360 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72  being read or wr
1f370 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65  itten might appe
1f380 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
1f390 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61  age.** or be sca
1f3a0 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75  ttered out on mu
1f3b0 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20  ltiple overflow 
1f3c0 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
1f3d0 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49  the BtCursor.isI
1f3e0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
1f3f0 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74  ag is set, and t
1f400 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75  he current.** cu
1f410 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
1f420 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
1f430 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73  flow pages, this
1f440 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c   function.** all
1f450 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f 72  ocates space for
1f460 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c   and lazily popl
1f470 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c  uates the overfl
1f480 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a  ow page-list .**
1f490 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
1f4a0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
1f4b0 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ). Subsequent ca
1f4c0 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20  lls use this.** 
1f4d0 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
1f4e0 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
1f4f0 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72  plied offset mor
1f500 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a  e efficient..**.
1f510 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66  ** Once an overf
1f520 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
1f530 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
1f540 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62  ocated, it may b
1f550 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
1f560 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   if some other c
1f570 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20  ursor writes to 
1f580 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20  the same table, 
1f590 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72  or if.** the cur
1f5a0 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
1f5b0 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e  a different row.
1f5c0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69   Additionally, i
1f5d0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  n auto-vacuum.**
1f5e0 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f   mode, the follo
1f5f0 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20  wing events may 
1f600 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76  invalidate an ov
1f610 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1f620 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   cache..**.**   
1f630 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  * An incremental
1f640 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20   vacuum,.**   * 
1f650 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f  A commit in auto
1f660 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d  _vacuum="full" m
1f670 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61  ode,.**   * Crea
1f680 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61  ting a table (ma
1f690 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67  y require moving
1f6a0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1f6b0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
1f6c0 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  t accessPayload(
1f6d0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1f6e0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
1f6f0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
1f700 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
1f710 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74   */.  u32 offset
1f720 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
1f730 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73  gin reading this
1f740 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61   far into payloa
1f750 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20  d */.  u32 amt, 
1f760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f770 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  ead this many by
1f780 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
1f790 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a  d char *pBuf, /*
1f7a0 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73   Write the bytes
1f7b0 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
1f7c0 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20  r */ .  int eOp 
1f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f7e0 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f  zero to read. no
1f7f0 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e  n-zero to write.
1f800 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
1f810 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
1f820 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1f830 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b  ITE_OK;.  u32 nK
1f840 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  ey;.  int iIdx =
1f850 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1f860 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1f870 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1f880 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20  ; /* Btree page 
1f890 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
1f8a0 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
1f8b0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8d0 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
1f8e0 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
1f8f0 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
1f900 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
1f910 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1f920 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1f930 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1f940 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1f950 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
1f960 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
1f970 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1f980 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65  Cur) );..  getCe
1f990 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1f9a0 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
1f9b0 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43  >info.pCell + pC
1f9c0 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
1f9d0 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67  ;.  nKey = (pPag
1f9e0 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20  e->intKey ? 0 : 
1f9f0 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
1fa00 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e 45  nKey);..  if( NE
1fa10 56 45 52 28 6f 66 66 73 65 74 2b 61 6d 74 20 3e  VER(offset+amt >
1fa20 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f   nKey+pCur->info
1fa30 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c 20 26  .nData) .   || &
1fa40 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
1fa50 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70  nfo.nLocal] > &p
1fa60 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
1fa70 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 29  >usableSize].  )
1fa80 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
1fa90 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
1faa0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
1fab0 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
1fac0 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74  error */.    ret
1fad0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1fae0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
1faf0 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
1fb00 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
1fb10 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
1fb20 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
1fb30 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
1fb40 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
1fb50 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
1fb60 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
1fb70 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
1fb80 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
1fb90 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
1fba0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
1fbb0 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
1fbc0 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
1fbd0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
1fbe0 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f  et], pBuf, a, eO
1fbf0 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  p, pPage->pDbPag
1fc00 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d  e);.    offset =
1fc10 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
1fc20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
1fc30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
1fc40 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
1fc50 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a  fo.nLocal;.  }..
1fc60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fc70 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
1fc80 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76      const u32 ov
1fc90 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  flSize = pBt->us
1fca0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f  ableSize - 4;  /
1fcb0 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20  * Bytes content 
1fcc0 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f  per ovfl page */
1fcd0 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61  .    Pgno nextPa
1fce0 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67  ge;..    nextPag
1fcf0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50  e = get4byte(&aP
1fd00 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
1fd10 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66  o.nLocal]);..#if
1fd20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1fd30 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a  _INCRBLOB.    /*
1fd40 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62 6c   If the isIncrbl
1fd50 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73  obHandle flag is
1fd60 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74 43   set and the BtC
1fd70 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
1fd80 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74  ].    ** has not
1fd90 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1fda0 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77   allocate it now
1fdb0 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20 73  . The array is s
1fdc0 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f  ized at.    ** o
1fdd0 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63  ne entry for eac
1fde0 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  h overflow page 
1fdf0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
1fe00 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a  chain. The.    *
1fe10 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
1fe20 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
1fe30 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f 72  low page is stor
1fe40 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b  ed in aOverflow[
1fe50 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20  0],.    ** etc. 
1fe60 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20  A value of 0 in 
1fe70 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  the aOverflow[] 
1fe80 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74  array means "not
1fe90 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20   yet known".    
1fea0 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69 73  ** (the cache is
1feb0 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65   lazily populate
1fec0 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d)..    */.    i
1fed0 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72 62  f( pCur->isIncrb
1fee0 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70 43  lobHandle && !pC
1fef0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
1ff00 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c  .      int nOvfl
1ff10 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   = (pCur->info.n
1ff20 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e  Payload-pCur->in
1ff30 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69  fo.nLocal+ovflSi
1ff40 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a  ze-1)/ovflSize;.
1ff50 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
1ff60 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29  rflow = (Pgno *)
1ff70 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1ff80 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e  o(sizeof(Pgno)*n
1ff90 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Ovfl);.      /* 
1ffa0 6e 4f 76 66 6c 20 69 73 20 61 6c 77 61 79 73 20  nOvfl is always 
1ffb0 70 6f 73 69 74 69 76 65 2e 20 20 49 66 20 69 74  positive.  If it
1ffc0 20 77 65 72 65 20 7a 65 72 6f 2c 20 66 65 74 63   were zero, fetc
1ffd0 68 50 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20 68  hPayload would h
1ffe0 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 65  ave.      ** bee
1fff0 6e 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  n used instead o
20000 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  f this routine. 
20010 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  */.      if( ALW
20020 41 59 53 28 6e 4f 76 66 6c 29 20 26 26 20 21 70  AYS(nOvfl) && !p
20030 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
20040 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
20050 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
20060 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
20070 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c  /* If the overfl
20080 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
20090 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
200a0 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20  cated and the.  
200b0 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
200c0 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
200d0 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
200e0 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
200f0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
20100 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o it..    */.   
20110 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
20120 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f  flow && pCur->aO
20130 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f  verflow[offset/o
20140 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20  vflSize] ){.    
20150 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
20160 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
20170 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
20180 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
20190 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  x];.      offset
201a0 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
201b0 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ize);.    }.#end
201c0 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72  if..    for( ; r
201d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
201e0 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67  amt>0 && nextPag
201f0 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66  e; iIdx++){..#if
20200 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20210 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
20220 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20  /* If required, 
20230 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  populate the ove
20240 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
20250 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20  cache. */.      
20260 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
20270 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61  low ){.        a
20280 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76  ssert(!pCur->aOv
20290 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20  erflow[iIdx] || 
202a0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
202b0 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29  iIdx]==nextPage)
202c0 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
202d0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
202e0 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20  = nextPage;.    
202f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
20300 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76    if( offset>=ov
20310 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
20320 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    /* The only re
20330 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69  ason to read thi
20340 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74  s page is to obt
20350 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20  ain the page.   
20360 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66       ** number f
20370 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  or the next page
20380 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
20390 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
203a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
203b0 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
203c0 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74  . So first try t
203d0 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65  o lookup the ove
203e0 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  rflow.        **
203f0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
20400 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66  , if any, then f
20410 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
20420 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
20430 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  ).        ** fun
20440 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ction..        *
20450 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
20460 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
20470 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
20480 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43  >aOverflow && pC
20490 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
204a0 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
204b0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
204c0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
204d0 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
204e0 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20   else .#endif.  
204f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74          rc = get
20500 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
20510 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26  , nextPage, 0, &
20520 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
20530 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66     offset -= ovf
20540 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c  lSize;.      }el
20550 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
20560 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73  eed to read this
20570 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20   page properly. 
20580 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  It contains some
20590 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
205a0 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61  ** range of data
205b0 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72   that is being r
205c0 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20  ead (eOp==0) or 
205d0 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29  written (eOp!=0)
205e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
205f0 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
20600 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
20610 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
20620 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69 66  file *fd;.#endif
20630 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d  .        int a =
20640 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66   amt;.        if
20650 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
20660 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
20670 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
20680 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
20690 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
206a0 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
206b0 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20  FLOW_READ.      
206c0 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20    /* If all the 
206d0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
206e0 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ue:.        **. 
206f0 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74         **   1) t
20700 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70  his is a read op
20710 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20  eration, and .  
20720 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61        **   2) da
20730 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ta is required f
20740 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66  rom the start of
20750 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70   this overflow p
20760 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20  age, and.       
20770 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61 74   **   3) the dat
20780 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62 61  abase is file-ba
20790 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20 20  cked, and.      
207a0 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65 20    **   4) there 
207b0 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65  is no open write
207c0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e  -transaction, an
207d0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35  d.        **   5
207e0 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
207f0 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74 61  s not a WAL data
20800 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  base,.        **
20810 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
20820 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61   data can be rea
20830 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  d directly from 
20840 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20850 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  e into the.     
20860 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66     ** output buf
20870 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74  fer, bypassing t
20880 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c  he page-cache al
20890 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73  together. This s
208a0 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  peeds.        **
208b0 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67   up loading larg
208c0 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73  e records that s
208d0 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f  pan many overflo
208e0 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20  w pages..       
208f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
20900 65 4f 70 3d 3d 30 20 20 20 20 20 20 20 20 20 20  eOp==0          
20910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20930 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20     /* (1) */.   
20940 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d        && offset=
20950 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
20980 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  2) */.         &
20990 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
209a0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44  tion==TRANS_READ
209b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209c0 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20       /* (4) */. 
209d0 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20 3d          && (fd =
209e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
209f0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d  e(pBt->pPager))-
20a00 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a  >pMethods     /*
20a10 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (3) */.        
20a20 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
20a30 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31  >aData[19]==0x01
20a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a50 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f         /* (5) */
20a60 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
20a70 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34        u8 aSave[4
20a80 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ];.          u8 
20a90 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b  *aWrite = &pBuf[
20aa0 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -4];.          m
20ab0 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72  emcpy(aSave, aWr
20ac0 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ite, 4);.       
20ad0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
20ae0 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65  sRead(fd, aWrite
20af0 2c 20 61 2b 34 2c 20 70 42 74 2d 3e 70 61 67 65  , a+4, pBt->page
20b00 53 69 7a 65 20 2a 20 28 6e 65 78 74 50 61 67 65  Size * (nextPage
20b10 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
20b20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
20b30 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20  yte(aWrite);.   
20b40 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57         memcpy(aW
20b50 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b  rite, aSave, 4);
20b60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
20b70 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b  endif..        {
20b80 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67  .          DbPag
20b90 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
20ba0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20bb0 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
20bc0 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
20bd0 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
20be0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
20bf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20c00 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
20c10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
20c20 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
20c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  .            nex
20c40 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
20c50 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
20c60 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
20c70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
20c80 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
20c90 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50  uf, a, eOp, pDbP
20ca0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
20cb0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
20cc0 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
20cd0 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
20ce0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
20cf0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
20d00 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
20d10 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b        pBuf += a;
20d20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20d30 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
20d40 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
20d50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
20d60 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
20d70 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
20d80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
20d90 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b  ad part of the k
20da0 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
20db0 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
20dc0 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
20dd0 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
20de0 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
20df0 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
20e00 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
20e10 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
20e20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
20e30 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70  st ensure that p
20e40 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
20e50 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a  to a valid row.*
20e60 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  * in the table..
20e70 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
20e80 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
20e90 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
20ea0 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
20eb0 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
20ec0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
20ed0 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
20ee0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
20ef0 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
20f00 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
20f10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
20f20 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
20f30 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
20f40 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
20f50 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Buf){.  assert( 
20f60 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
20f70 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
20f80 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
20f90 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
20fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
20fb0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
20fc0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
20fd0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
20fe0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
20ff0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
21000 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21010 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
21020 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73  ;.  return acces
21030 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
21040 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
21050 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
21060 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
21070 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
21080 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
21090 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
210a0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
210b0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
210c0 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
210d0 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
210e0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
210f0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
21100 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
21110 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
21120 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
21130 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
21140 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
21150 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
21160 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
21170 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
21180 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
21190 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
211a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
211b0 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
211c0 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
211d0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
211e0 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
211f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21200 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
21210 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
21220 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
21230 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
21240 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
21250 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
21260 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
21270 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21280 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
21290 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
212a0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
212b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
212c0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
212d0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
212e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
212f0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
21300 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
21310 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
21320 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21330 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
21340 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
21350 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
21360 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
21370 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
21380 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
21390 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   pBuf, 0);.  }. 
213a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
213b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
213c0 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
213d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
213e0 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
213f0 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
21400 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
21410 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
21420 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
21430 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
21440 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d  key if skipKey==
21450 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20  0 and it points 
21460 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
21470 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73   of data if.** s
21480 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20  kipKey==1.  The 
21490 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
214a0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79  of available key
214b0 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e  /data is written
214c0 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  .** into *pAmt. 
214d0 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
214e0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
214f0 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62  urned will not b
21500 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69  e.** a valid poi
21510 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
21520 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
21530 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
21540 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
21550 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
21560 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
21570 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
21580 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
21590 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
215a0 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
215b0 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
215c0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
215d0 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
215e0 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
215f0 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
21600 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
21610 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
21620 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
21630 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
21640 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50  es, then accessP
21650 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65  ayload() must be
21660 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d   used to reassem
21670 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64  ble.** the key/d
21680 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20  ata and copy it 
21690 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
216a0 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  ted buffer..**.*
216b0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
216c0 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72  turned by this r
216d0 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72  outine looks dir
216e0 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63  ectly into the c
216f0 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66  ached.** page of
21700 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
21710 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63  The data might c
21720 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68  hange or move th
21730 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61  e next time.** a
21740 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65  ny btree routine
21750 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
21760 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
21770 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68  gned char *fetch
21780 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
21790 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
217a0 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
217b0 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
217c0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
217d0 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20  t *pAmt,        
217e0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
217f0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
21800 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a  ble bytes here *
21810 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20  /.  int skipKey 
21820 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64           /* read
21830 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61   beginning at da
21840 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72  ta if this is tr
21850 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  ue */.){.  unsig
21860 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
21870 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ad;.  MemPage *p
21880 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79  Page;.  u32 nKey
21890 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a  ;.  u32 nLocal;.
218a0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
218b0 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  =0 && pCur->iPag
218c0 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
218d0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
218e0 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ]);.  assert( pC
218f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
21900 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
21910 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
21920 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
21930 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
21940 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21950 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
21960 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
21970 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
21980 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 4e 45  Cell );.  if( NE
21990 56 45 52 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  VER(pCur->info.n
219a0 53 69 7a 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  Size==0) ){.    
219b0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
219c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
219d0 2d 3e 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e  ->iPage], pCur->
219e0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
219f0 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e],.            
21a00 20 20 20 20 20 20 20 26 70 43 75 72 2d 3e 69 6e         &pCur->in
21a10 66 6f 29 3b 0a 20 20 7d 0a 20 20 61 50 61 79 6c  fo);.  }.  aPayl
21a20 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
21a30 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f  .pCell;.  aPaylo
21a40 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ad += pCur->info
21a50 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20  .nHeader;.  if( 
21a60 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
21a70 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20  .    nKey = 0;. 
21a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79   }else{.    nKey
21a90 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
21aa0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  fo.nKey;.  }.  i
21ab0 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
21ac0 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b    aPayload += nK
21ad0 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  ey;.    nLocal =
21ae0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
21af0 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c  al - nKey;.  }el
21b00 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  se{.    nLocal =
21b10 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
21b20 61 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  al;.    assert( 
21b30 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a  nLocal<=nKey );.
21b40 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c    }.  *pAmt = nL
21b50 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61  ocal;.  return a
21b60 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
21b70 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
21b80 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
21b90 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
21ba0 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
21bb0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
21bc0 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
21bd0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
21be0 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
21bf0 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
21c00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
21c10 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
21c20 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
21c30 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
21c40 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
21c50 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
21c60 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
21c70 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
21c80 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
21c90 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
21ca0 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
21cb0 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
21cc0 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
21cd0 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
21ce0 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
21cf0 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
21d00 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
21d10 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
21d20 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
21d30 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
21d40 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
21d50 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
21d60 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
21d70 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
21d80 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
21d90 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
21da0 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
21db0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
21dc0 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68  te3BtreeKeyFetch
21dd0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
21de0 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63   int *pAmt){.  c
21df0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30  onst void *p = 0
21e00 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
21e10 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
21e20 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
21e30 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
21e40 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
21e50 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
21e60 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72   if( ALWAYS(pCur
21e70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
21e80 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70  _VALID) ){.    p
21e90 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
21ea0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
21eb0 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d  r, pAmt, 0);.  }
21ec0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 63  .  return p;.}.c
21ed0 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
21ee0 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63 68  e3BtreeDataFetch
21ef0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
21f00 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63   int *pAmt){.  c
21f10 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30  onst void *p = 0
21f20 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
21f30 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
21f40 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
21f50 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
21f60 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
21f70 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
21f80 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72   if( ALWAYS(pCur
21f90 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
21fa0 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70  _VALID) ){.    p
21fb0 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
21fc0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
21fd0 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d  r, pAmt, 1);.  }
21fe0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
21ff0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
22000 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
22010 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
22020 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
22030 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
22040 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
22050 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
22060 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a  o move to..**.**
22070 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
22080 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f  eturns SQLITE_CO
22090 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67  RRUPT if the pag
220a0 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66  e-header flags f
220b0 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ield of.** the n
220c0 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f  ew child page do
220d0 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
220e0 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20   flags field of 
220f0 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e  the parent (i.e.
22100 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79  .** if an intkey
22110 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f   page appears to
22120 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f   be the parent o
22130 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70  f a non-intkey p
22140 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d  age, or.** vice-
22150 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69  versa)..*/.stati
22160 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
22170 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
22180 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
22190 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
221a0 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  i = pCur->iPage;
221b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
221c0 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64  Page;.  BtShared
221d0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
221e0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
221f0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
22200 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
22210 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
22220 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
22230 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22240 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
22250 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66  AX_DEPTH );.  if
22260 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
22270 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
22280 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
22290 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
222a0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
222b0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
222c0 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
222d0 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69   &pNewPage);.  i
222e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
222f0 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67  c;.  pCur->apPag
22300 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67  e[i+1] = pNewPag
22310 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  e;.  pCur->aiIdx
22320 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75  [i+1] = 0;.  pCu
22330 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70  r->iPage++;..  p
22340 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
22350 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
22360 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
22370 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c  ( pNewPage->nCel
22380 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d  l<1 || pNewPage-
22390 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61  >intKey!=pCur->a
223a0 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79  pPage[i]->intKey
223b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
223c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
223d0 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
223e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
223f0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
22400 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74  .** Page pParent
22410 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
22420 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20  (non-leaf) tree 
22430 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74  page. This funct
22440 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20  ion .** asserts 
22450 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72  that page number
22460 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c   iChild is the l
22470 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65  eft-child if the
22480 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c   iIdx'th.** cell
22490 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74   in page pParent
224a0 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73  . Or, if iIdx is
224b0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f   equal to the to
224c0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  tal number of.**
224d0 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
224e0 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  t, that page num
224f0 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
22500 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
22510 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  .** the page..*/
22520 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
22530 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d  ertParentIndex(M
22540 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
22550 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20   int iIdx, Pgno 
22560 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72  iChild){.  asser
22570 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74  t( iIdx<=pParent
22580 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
22590 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e   iIdx==pParent->
225a0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73  nCell ){.    ass
225b0 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70  ert( get4byte(&p
225c0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
225d0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
225e0 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  +8])==iChild );.
225f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
22600 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69  ert( get4byte(fi
22610 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
22620 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29  iIdx))==iChild )
22630 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
22640 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61   define assertPa
22650 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29  rentIndex(x,y,z)
22660 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20   .#endif../*.** 
22670 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
22680 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
22690 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
226a0 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
226b0 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
226c0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
226d0 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
226e0 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
226f0 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
22700 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
22710 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
22720 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
22730 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
22740 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
22750 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
22760 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
22770 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
22780 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  d moveToParent(B
22790 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
227a0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
227b0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
227c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
227d0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
227e0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
227f0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
22800 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
22810 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
22820 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
22830 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
22840 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
22850 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
22860 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
22870 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22880 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
22890 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
228a0 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20  ge]->pgno.  );. 
228b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
228c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
228d0 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d  iPage]);.  pCur-
228e0 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72  >iPage--;.  pCur
228f0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
22900 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
22910 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Key = 0;.}../*.*
22920 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
22930 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
22940 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
22950 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
22960 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
22970 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
22980 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
22990 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
229a0 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
229b0 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
229c0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
229d0 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
229e0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
229f0 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
22a00 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
22a10 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
22a20 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
22a30 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
22a40 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
22a50 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
22a60 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
22a70 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
22a80 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
22a90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
22aa0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
22ab0 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
22ac0 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
22ad0 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
22ae0 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69  INVALID. Otherwi
22af0 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  se, the cursor i
22b00 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
22b10 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  o the first.** c
22b20 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
22b30 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74  he root (or virt
22b40 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
22b50 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
22b60 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ate.** is set to
22b70 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
22b80 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
22b90 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
22ba0 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
22bb0 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
22bc0 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
22bd0 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
22be0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
22bf0 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
22c00 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
22c10 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
22c20 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
22c30 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
22c40 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
22c50 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
22c60 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
22c70 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
22c80 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
22c90 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
22ca0 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
22cb0 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
22cc0 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
22cd0 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
22ce0 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
22cf0 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
22d00 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
22d10 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
22d20 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
22d30 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
22d40 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
22d50 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
22d60 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
22d70 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
22d80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22d90 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
22da0 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
22db0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
22dc0 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
22dd0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
22de0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
22df0 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
22e00 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
22e10 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
22e20 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
22e30 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
22e40 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
22e50 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
22e60 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
22e70 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
22e80 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
22e90 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
22ea0 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
22eb0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
22ec0 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
22ed0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
22ee0 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
22ef0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65  E_OK );.      re
22f00 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
22f10 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ext;.    }.    s
22f20 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
22f30 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
22f40 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  }..  if( pCur->i
22f50 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69  Page>=0 ){.    i
22f60 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
22f70 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  1; i<=pCur->iPag
22f80 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
22f90 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
22fa0 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
22fb0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
22fc0 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ge = 0;.  }else 
22fd0 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  if( pCur->pgnoRo
22fe0 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75  ot==0 ){.    pCu
22ff0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
23000 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
23010 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23020 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
23030 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
23040 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
23050 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
23060 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 20 20 69  pPage[0]);.    i
23070 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23080 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
23090 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
230a0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
230b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
230c0 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
230d0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  = 0;..    /* If 
230e0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69  pCur->pKeyInfo i
230f0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
23100 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74   the caller that
23110 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72   opened this cur
23120 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78 70 65 63  sor.    ** expec
23130 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
23140 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
23150 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
23160 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 20   pKeyInfo is.   
23170 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
23180 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
23190 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
231a0 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
231b0 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74  case,.    ** ret
231c0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
231d0 52 52 55 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f  RRUPT error.  */
231e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
231f0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
23200 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d  tKey==1 || pCur-
23210 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
23220 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ey==0 );.    if(
23230 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
23240 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61 70 50 61  ==0)!=pCur->apPa
23250 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b  ge[0]->intKey ){
23260 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
23270 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
23280 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
23290 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
232a0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
232b0 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20 74  of the correct t
232c0 79 70 65 2e 20 54 68 69 73 20 6d 75 73 74 20 62  ype. This must b
232d0 65 20 74 68 65 0a 20 20 2a 2a 20 63 61 73 65 20  e the.  ** case 
232e0 61 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 74  as the call to t
232f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  his function tha
23300 74 20 6c 6f 61 64 65 64 20 74 68 65 20 72 6f 6f  t loaded the roo
23310 74 2d 70 61 67 65 20 28 65 69 74 68 65 72 0a 20  t-page (either. 
23320 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 6f 72   ** this call or
23330 20 61 20 70 72 65 76 69 6f 75 73 20 69 6e 76 6f   a previous invo
23340 63 61 74 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61  cation) would ha
23350 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
23360 75 70 74 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20  uption .  ** if 
23370 74 68 65 20 61 73 73 75 6d 70 74 69 6f 6e 20 77  the assumption w
23380 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
23390 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
233a0 69 62 6c 65 20 66 6f 72 20 74 68 65 20 66 6c 61  ible for the fla
233b0 67 73 20 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f  gs .  ** byte to
233c0 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
233d0 69 65 64 20 77 68 69 6c 65 20 74 68 69 73 20 63  ied while this c
233e0 75 72 73 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67  ursor is holding
233f0 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20 2a   a reference.  *
23400 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20 20  * to the page.  
23410 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75  */.  pRoot = pCu
23420 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20  r->apPage[0];.  
23430 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
23440 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
23450 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  oot );.  assert(
23460 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26   pRoot->isInit &
23470 26 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  & (pCur->pKeyInf
23480 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)==pRoot->in
23490 74 4b 65 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d  tKey );..  pCur-
234a0 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
234b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
234c0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61  e = 0;.  pCur->a
234d0 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75  tLast = 0;.  pCu
234e0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
234f0 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  ;..  if( pRoot->
23500 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f  nCell==0 && !pRo
23510 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
23520 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
23530 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e    if( pRoot->pgn
23540 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  o!=1 ) return SQ
23550 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
23560 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d  T;.    subpage =
23570 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74   get4byte(&pRoot
23580 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
23590 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
235a0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
235b0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
235c0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
235d0 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
235e0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
235f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
23600 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ((pRoot->nCell>0
23610 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43  )?CURSOR_VALID:C
23620 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a  URSOR_INVALID);.
23630 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
23650 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
23660 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
23670 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
23680 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
23690 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
236a0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
236b0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
236c0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
236d0 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
236e0 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
236f0 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
23700 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
23710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
23720 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
23730 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
23740 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
23750 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23760 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
23770 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
23780 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
23790 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
237a0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
237b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
237c0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
237d0 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
237e0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
237f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
23800 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
23810 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
23820 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
23830 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
23840 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
23850 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
23860 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
23870 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20  r->iPage]));.   
23880 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
23890 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
238a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
238b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
238c0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
238d0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
238e0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
238f0 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
23900 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
23910 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
23920 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
23930 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
23940 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
23950 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
23960 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
23970 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
23980 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
23990 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
239a0 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
239b0 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
239c0 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
239d0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
239e0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
239f0 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
23a00 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
23a10 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
23a20 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
23a30 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
23a40 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
23a50 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
23a60 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
23a70 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
23a80 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
23a90 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
23aa0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
23ab0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
23ac0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
23ad0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
23ae0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
23af0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
23b00 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
23b10 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
23b20 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
23b30 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
23b40 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
23b50 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
23b60 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
23b70 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
23b80 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
23b90 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
23ba0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
23bb0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
23bc0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
23bd0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
23be0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
23bf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
23c00 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
23c10 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
23c20 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43  >nCell-1;.    pC
23c30 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
23c40 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
23c50 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
23c60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23c70 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
23c80 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
23c90 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
23ca0 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
23cb0 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
23cc0 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
23cd0 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
23ce0 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
23cf0 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
23d00 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
23d10 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
23d20 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
23d30 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23d40 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
23d50 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
23d60 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
23d70 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
23d80 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
23d90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23da0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
23db0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
23dc0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
23dd0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
23de0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
23df0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
23e00 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23e10 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
23e20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23e30 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
23e40 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
23e50 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
23e60 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
23e70 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
23e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
23e90 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
23ea0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
23eb0 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
23ec0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
23ed0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
23ee0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
23ef0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
23f00 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
23f10 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
23f20 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
23f30 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
23f40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
23f50 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
23f60 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
23f70 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
23f80 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
23f90 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
23fa0 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
23fb0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
23fc0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
23fd0 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
23fe0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
23ff0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
24000 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  . .  assert( cur
24010 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
24020 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
24030 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
24040 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
24050 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
24060 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
24070 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  sor already poin
24080 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ts to the last e
24090 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20  ntry, this is a 
240a0 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
240b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
240c0 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43  ur->eState && pC
240d0 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69  ur->atLast ){.#i
240e0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
240f0 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
24100 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
24110 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
24120 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
24130 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
24140 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
24150 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
24160 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
24170 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
24180 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
24190 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
241a0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
241b0 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
241c0 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
241d0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
241e0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
241f0 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72  ur->iPage]==pCur
24200 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24210 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
24220 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
24230 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24240 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
24250 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
24260 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24270 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
24280 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
24290 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
242a0 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
242b0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
242c0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
242d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
242e0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
242f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24300 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
24310 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
24320 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
24330 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24340 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
24350 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
24360 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
24370 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
24380 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
24390 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61        pCur->atLa
243a0 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  st = rc==SQLITE_
243b0 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20  OK ?1:0;.    }. 
243c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
243d0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
243e0 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
243f0 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
24400 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
24410 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
24420 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
24430 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
24440 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
24450 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
24460 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
24470 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
24480 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
24490 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
244a0 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
244b0 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
244c0 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
244d0 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
244e0 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
244f0 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
24500 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
24510 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
24520 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
24530 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
24540 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
24550 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
24560 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
24570 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
24580 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
24590 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
245a0 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
245b0 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
245c0 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
245d0 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
245e0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
245f0 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
24600 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
24610 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
24620 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
24630 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
24640 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
24650 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
24660 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
24670 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
24680 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
24690 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
246a0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
246b0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
246c0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
246d0 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
246e0 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
246f0 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
24700 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
24710 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
24720 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
24730 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
24740 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
24750 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
24760 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
24770 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
24780 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
24790 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
247a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247b0 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
247c0 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
247d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
247e0 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
247f0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
24800 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
24810 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
24820 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
24830 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
24840 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  IdxKey..**.*/.in
24850 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
24860 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
24870 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
24880 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24890 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
248a0 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
248b0 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
248c0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
248d0 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
248e0 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
248f0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
24900 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
24910 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
24920 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
24930 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
24940 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
24950 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
24960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24970 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
24980 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
24990 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
249a0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
249b0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
249c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
249d0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
249e0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
249f0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
24a00 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
24a10 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
24a20 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
24a30 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
24a40 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
24a50 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
24a60 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
24a70 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
24a80 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
24a90 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
24aa0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
24ab0 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
24ac0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
24ad0 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70  URSOR_VALID && p
24ae0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a  Cur->validNKey .
24af0 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61     && pCur->apPa
24b00 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20  ge[0]->intKey . 
24b10 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
24b20 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
24b30 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
24b40 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
24b50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24b60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
24b70 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43  ur->atLast && pC
24b80 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e  ur->info.nKey<in
24b90 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
24ba0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
24bb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24bc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
24bd0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
24be0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
24bf0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
24c00 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
24c10 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
24c20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
24c30 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
24c40 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
24c50 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
24c60 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24c70 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69  r->iPage]->isIni
24c80 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
24c90 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
24ca0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
24cb0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
24cc0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
24cd0 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
24ce0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
24cf0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
24d00 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
24d10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
24d20 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
24d30 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24d40 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
24d50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
24d60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
24d70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
24d80 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
24d90 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
24da0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
24db0 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 3b 0a 20  lwr, upr, idx;. 
24dc0 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
24dd0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
24de0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
24df0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
24e00 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20      int c;..    
24e10 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  /* pPage->nCell 
24e20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20  must be greater 
24e30 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68  than zero. If th
24e40 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70  is is the root-p
24e50 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  age.    ** the c
24e60 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65  ursor would have
24e70 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62   been INVALID ab
24e80 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72  ove and this for
24e90 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a  (;;) loop.    **
24ea0 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69   not run. If thi
24eb0 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f  s is not the roo
24ec0 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t-page, then the
24ed0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72   moveToChild() r
24ee0 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f  outine.    ** wo
24ef0 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
24f00 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72   detected db cor
24f10 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72  ruption. Similar
24f20 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20  ly, pPage must. 
24f30 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67     ** be the rig
24f40 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f  ht kind (index o
24f50 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72  r table) of b-tr
24f60 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  ee page. Otherwi
24f70 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65  se.    ** a move
24f80 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76  ToChild() or mov
24f90 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77  eToRoot() call w
24fa0 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74  ould have detect
24fb0 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  ed corruption.  
24fc0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
24fd0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
24fe0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24ff0 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64  ge->intKey==(pId
25000 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20  xKey==0) );.    
25010 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72  lwr = 0;.    upr
25020 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
25030 31 3b 0a 20 20 20 20 69 66 28 20 62 69 61 73 52  1;.    if( biasR
25040 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43  ight ){.      pC
25050 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
25060 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69  iPage] = (u16)(i
25070 64 78 20 3d 20 75 70 72 29 3b 0a 20 20 20 20 7d  dx = upr);.    }
25080 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72  else{.      pCur
25090 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
250a0 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78  age] = (u16)(idx
250b0 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b   = (upr+lwr)/2);
250c0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b  .    }.    for(;
250d0 3b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  ;){.      u8 *pC
250e0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
250f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25100 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72   Pointer to curr
25110 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67  ent cell in pPag
25120 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65  e */..      asse
25130 72 74 28 20 69 64 78 3d 3d 70 43 75 72 2d 3e 61  rt( idx==pCur->a
25140 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
25150 5d 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ] );.      pCur-
25160 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
25170 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  .      pCell = f
25180 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
25190 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
251a0 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
251b0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
251c0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36  ey ){.        i6
251d0 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
251e0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
251f0 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
25200 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
25210 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b           pCell +
25220 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43  = getVarint32(pC
25230 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20  ell, dummy);.   
25240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
25250 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
25260 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
25270 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
25280 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  ellKey==intKey )
25290 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
252a0 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
252b0 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e   if( nCellKey<in
252c0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
252d0 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    c = -1;.      
252e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
252f0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
25300 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  Key>intKey );.  
25310 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a          c = +1;.
25320 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25330 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
25340 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  y = 1;.        p
25350 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
25360 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
25370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25380 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  /* The maximum s
25390 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69  upported page-si
253a0 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65  ze is 65536 byte
253b0 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  s. This means th
253c0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  at.        ** th
253d0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
253e0 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73   of record bytes
253f0 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e   stored on an in
25400 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20  dex B-Tree.     
25410 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65     ** page is le
25420 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79  ss than 16384 by
25430 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73  tes and may be s
25440 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74  tored as a 2-byt
25450 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72  e.        ** var
25460 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d  int. This inform
25470 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
25480 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69   attempt to avoi
25490 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20  d parsing .     
254a0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
254b0 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e   cell by checkin
254c0 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20  g for the cases 
254d0 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64  where the record
254e0 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
254f0 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20  stored entirely 
25500 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65  within the b-tre
25510 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63  e page by inspec
25520 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a  ting the first .
25530 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74          ** 2 byt
25540 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  es of the cell..
25550 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
25560 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70     int nCell = p
25570 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Cell[0];.       
25580 20 69 66 28 20 21 28 6e 43 65 6c 6c 20 26 20 30   if( !(nCell & 0
25590 78 38 30 29 0a 20 20 20 20 20 20 20 20 20 26 26  x80).         &&
255a0 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d   nCell<=pPage->m
255b0 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20  axLocal.        
255c0 20 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c   && (pCell+nCell
255d0 2b 31 29 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74  +1)<=pPage->aDat
255e0 61 45 6e 64 0a 20 20 20 20 20 20 20 20 29 7b 0a  aEnd.        ){.
255f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
25600 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
25610 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   the record-size
25620 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65   field of the ce
25630 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20  ll is a.        
25640 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65    ** single byte
25650 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
25660 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69  record fits enti
25670 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
25680 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d  .          ** b-
25690 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
256a0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
256b0 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31  e( pCell+nCell+1
256c0 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ==pPage->aDataEn
256d0 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  d );.          c
256e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
256f0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
25700 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
25710 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [1], pIdxKey);. 
25720 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
25730 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78   !(pCell[1] & 0x
25740 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26  80) .          &
25750 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65  & (nCell = ((nCe
25760 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70  ll&0x7f)<<7) + p
25770 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d  Cell[1])<=pPage-
25780 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20  >maxLocal.      
25790 20 20 20 20 26 26 20 28 70 43 65 6c 6c 2b 6e 43      && (pCell+nC
257a0 65 6c 6c 2b 32 29 3c 3d 70 50 61 67 65 2d 3e 61  ell+2)<=pPage->a
257b0 44 61 74 61 45 6e 64 0a 20 20 20 20 20 20 20 20  DataEnd.        
257c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
257d0 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  The record-size 
257e0 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74  field is a 2 byt
257f0 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
25800 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20   record .       
25810 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72     ** fits entir
25820 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ely on the main 
25830 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
25840 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
25850 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
25860 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +2==pPage->aData
25870 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
25880 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
25890 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
258a0 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
258b0 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[2], pIdxKey);
258c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
258d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
258e0 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76   record flows ov
258f0 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  er onto one or m
25900 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
25910 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20  es. In.         
25920 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68   ** this case th
25930 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65  e whole cell nee
25940 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c  ds to be parsed,
25950 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
25960 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
25970 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f   and accessPaylo
25980 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74  ad() used to ret
25990 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64  rieve the record
259a0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
259b0 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65      ** buffer be
259c0 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43  fore VdbeRecordC
259d0 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20  ompare() can be 
259e0 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20  called. */.     
259f0 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
25a00 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
25a10 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
25a20 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
25a30 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
25a40 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  e;.          btr
25a50 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
25a60 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c  Page, pCellBody,
25a70 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
25a80 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d           nCell =
25a90 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
25aa0 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  .nKey;.         
25ab0 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
25ac0 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
25ad0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
25ae0 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b  ( pCellKey==0 ){
25af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
25b00 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
25b10 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
25b20 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
25b30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25b40 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
25b50 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
25b60 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
25b70 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
25b80 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 0);.         
25b90 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
25ba0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
25bb0 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
25bc0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
25bd0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
25be0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25bf0 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
25c00 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
25c10 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65  e(nCell, pCellKe
25c20 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
25c30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
25c40 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
25c50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
25c60 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
25c70 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
25c80 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
25c90 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
25ca0 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
25cb0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 62  idx;.          b
25cc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
25cd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  lse{.          *
25ce0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
25cf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25d00 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
25d10 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
25d20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25d30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c    }.      if( c<
25d40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72  0 ){.        lwr
25d50 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
25d60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
25d70 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
25d80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77    }.      if( lw
25d90 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20  r>upr ){.       
25da0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25db0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
25dc0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
25dd0 20 28 75 31 36 29 28 69 64 78 20 3d 20 28 6c 77   (u16)(idx = (lw
25de0 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d  r+upr)/2);.    }
25df0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
25e00 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61 67  ==upr+1 || (pPag
25e10 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
25e20 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20  age->leaf) );.  
25e30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
25e40 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69  >isInit );.    i
25e50 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
25e60 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
25e70 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
25e80 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
25e90 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
25ea0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
25eb0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
25ec0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
25ed0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25ee0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
25ef0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
25f00 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
25f10 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50   }.    if( chldP
25f20 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  g==0 ){.      as
25f30 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
25f40 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
25f50 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
25f60 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
25f70 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
25f80 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
25f90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
25fa0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
25fb0 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  sh;.    }.    pC
25fc0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
25fd0 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77  iPage] = (u16)lw
25fe0 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  r;.    pCur->inf
25ff0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
26000 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
26010 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
26020 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
26030 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
26040 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65  ( rc ) goto move
26050 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d  to_finish;.  }.m
26060 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
26070 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
26080 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
26090 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
260a0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
260b0 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
260c0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
260d0 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
260e0 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
260f0 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
26100 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
26110 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
26120 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
26130 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
26140 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
26150 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
26160 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
26170 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
26180 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
26190 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
261a0 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
261b0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
261c0 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
261d0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
261e0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
261f0 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
26200 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
26210 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
26220 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
26230 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
26240 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
26250 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
26260 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
26270 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
26280 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
26290 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
262a0 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
262b0 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
262c0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
262d0 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
262e0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
262f0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
26300 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
26310 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
26320 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
26330 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
26340 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
26350 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
26360 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
26370 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
26380 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
26390 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
263a0 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
263b0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
263c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
263d0 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
263e0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
263f0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
26400 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
26410 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
26420 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
26430 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
26440 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
26450 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
26460 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
26470 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
26480 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
26490 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
264a0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
264b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
264c0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
264d0 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 70 43  Next>0 ){.    pC
264e0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
264f0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
26500 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26510 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
26520 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
26530 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
26540 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26550 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b  Page];.  idx = +
26560 2b 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 3b 0a 20 20 61 73 73  r->iPage];.  ass
26580 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
26590 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
265a0 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx<=pPage->nCel
265b0 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  l );..  pCur->in
265c0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
265d0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
265e0 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d  = 0;.  if( idx>=
265f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
26600 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
26610 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
26620 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
26630 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
26640 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
26650 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
26660 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
26670 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
26680 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
26690 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
266a0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
266b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
266c0 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
266d0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
266e0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
266f0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
26700 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
26710 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
26720 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
26730 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
26740 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
26750 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
26760 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
26770 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26780 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
26790 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
267a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
267b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
267c0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
267d0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
267e0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
267f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
26800 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
26810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26820 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26830 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
26840 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
26850 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
26860 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
26870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26880 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
26890 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
268a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
268b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  }.../*.** Step t
268c0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
268d0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
268e0 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
268f0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
26900 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
26910 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
26920 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
26930 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
26940 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
26950 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
26960 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
26970 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
26980 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
26990 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
269a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
269b0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
269c0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
269d0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
269e0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
269f0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
26a00 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
26a10 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
26a20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
26a30 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
26a40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26a50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
26a60 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61  c;.  }.  pCur->a
26a70 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28  tLast = 0;.  if(
26a80 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
26a90 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
26aa0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
26ab0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26ac0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
26ad0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30  pCur->skipNext<0
26ae0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
26af0 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
26b00 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
26b10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26b20 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
26b30 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50  pNext = 0;..  pP
26b40 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
26b50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
26b60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26b70 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
26b80 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
26b90 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
26ba0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
26bb0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63  ->iPage];.    rc
26bc0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
26bd0 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
26be0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
26bf0 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
26c00 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
26c10 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
26c20 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
26c30 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
26c40 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
26c50 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
26c60 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20  >iPage]==0 ){.  
26c70 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
26c80 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
26c90 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
26ca0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
26cb0 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
26cc0 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
26cd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
26ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
26cf0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
26d00 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
26d10 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
26d20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
26d30 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43  Key = 0;..    pC
26d40 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
26d50 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50  iPage]--;.    pP
26d60 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
26d70 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
26d80 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
26d90 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
26da0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
26db0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
26dc0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
26dd0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
26de0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
26df0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
26e00 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
26e10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26e20 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
26e30 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
26e40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
26e50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
26e60 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
26e70 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
26e80 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
26e90 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
26ea0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
26eb0 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
26ec0 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
26ed0 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
26ee0 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
26ef0 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
26f00 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
26f10 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
26f20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
26f30 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
26f40 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
26f50 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
26f60 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
26f70 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
26f80 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
26f90 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
26fa0 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
26fb0 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
26fc0 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75  and *pPgno are u
26fd0 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20  ndefined in the 
26fe0 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
26ff0 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76  r..** Do not inv
27000 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  oke sqlite3Pager
27010 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61  Unref() on *ppPa
27020 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  ge if an error i
27030 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
27040 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
27050 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
27060 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65  ot 0, then a (fe
27070 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20  eble) effort is 
27080 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
27090 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
270a0 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
270b0 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
270c0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
270d0 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
270e0 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
270f0 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
27100 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
27110 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
27120 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
27130 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
27140 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
27150 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
27160 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72  exact" parameter
27170 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74   is not 0, and t
27180 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e  he page-number n
27190 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a  earby exists .**
271a0 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
271b0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
271c0 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65   it is guarentee
271d0 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
271e0 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c  . This.** is onl
271f0 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  y used by auto-v
27200 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20  acuum databases 
27210 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20  when allocating 
27220 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a  a new table..*/.
27230 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
27240 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
27250 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a  BtShared *pBt, .
27260 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
27270 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ge, .  Pgno *pPg
27280 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72  no, .  Pgno near
27290 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29  by,.  u8 exact.)
272a0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
272b0 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
272c0 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
272d0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
272e0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
272f0 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
27300 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
27310 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
27320 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
27330 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
27340 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
27350 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
27360 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
27370 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
27380 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
27390 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
273a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
273b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
273c0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
273d0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
273e0 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74  1;.  mxPage = bt
273f0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
27400 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  );.  n = get4byt
27410 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
27420 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73  [36]);.  testcas
27430 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29  e( n==mxPage-1 )
27440 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67  ;.  if( n>=mxPag
27450 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
27460 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
27470 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  KPT;.  }.  if( n
27480 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
27490 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
274a0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
274b0 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
274c0 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
274d0 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
274e0 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
274f0 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
27500 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
27510 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
27520 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
27530 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61    /* If the 'exa
27540 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61  ct' parameter wa
27550 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65  s true and a que
27560 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
27570 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
27580 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
27590 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
275a0 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
275b0 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
275c0 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
275d0 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
275e0 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
275f0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
27600 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27610 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
27620 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72  f( exact && near
27630 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20  by<=mxPage ){.  
27640 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
27650 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
27660 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  by>0 );.      as
27670 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
27680 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72  acuum );.      r
27690 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
276a0 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
276b0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
276c0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
276d0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
276e0 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
276f0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61  E ){.        sea
27700 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
27710 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e     }.      *pPgn
27720 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  o = nearby;.    
27730 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
27740 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Decrement the f
27750 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62  ree-list count b
27760 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20  y 1. Set iTrunk 
27770 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
27780 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
27790 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
277a0 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e   page. iPrevTrun
277b0 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31  k is initially 1
277c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
277d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
277e0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
277f0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
27800 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
27810 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
27820 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
27830 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
27840 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
27850 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
27860 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
27870 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
27880 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
27890 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
278a0 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
278b0 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
278c0 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
278d0 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
278e0 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
278f0 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e  rby' is located.
27900 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
27910 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
27920 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
27930 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
27940 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75   ){.        iTru
27950 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
27960 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
27970 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
27980 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  e{.        iTrun
27990 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
279a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
279b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
279c0 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
279d0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
279e0 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
279f0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  age ){.        r
27a00 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
27a10 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
27a20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
27a30 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
27a40 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
27a50 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
27a60 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
27a70 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  {.        pTrunk
27a80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
27a90 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
27aa0 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  page;.      }.  
27ab0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75      assert( pTru
27ac0 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  nk!=0 );.      a
27ad0 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61  ssert( pTrunk->a
27ae0 44 61 74 61 21 3d 30 20 29 3b 0a 0a 20 20 20 20  Data!=0 );..    
27af0 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26    k = get4byte(&
27b00 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
27b10 29 3b 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65  ); /* # of leave
27b20 73 20 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b 20  s on this trunk 
27b30 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
27b40 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
27b50 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
27b60 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
27b70 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
27b80 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
27b90 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
27ba0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
27bb0 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
27bc0 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
27bd0 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
27be0 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
27bf0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
27c00 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
27c10 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
27c20 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
27c30 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27c40 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
27c50 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
27c60 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
27c70 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
27c80 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
27c90 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
27ca0 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
27cb0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
27cc0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
27cd0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
27ce0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
27cf0 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
27d00 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
27d10 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
27d20 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
27d30 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
27d40 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
27d50 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
27d60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
27d70 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62  >(u32)(pBt->usab
27d80 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b  leSize/4 - 2) ){
27d90 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
27da0 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
27db0 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
27dc0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
27dd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27de0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
27df0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
27e00 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
27e10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
27e20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
27e30 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
27e40 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e   searchList && n
27e50 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b  earby==iTrunk ){
27e60 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
27e70 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
27e80 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
27e90 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
27ea0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
27eb0 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
27ec0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
27ed0 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
27ee0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
27ef0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a         assert( *
27f00 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b  pPgno==iTrunk );
27f10 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
27f20 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
27f30 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
27f40 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
27f50 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
27f60 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
27f70 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
27f80 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
27f90 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
27fa0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
27fb0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
27fc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
27fd0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
27fe0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
27ff0 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
28000 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
28010 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
28020 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
28030 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
28040 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
28050 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
28060 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
28070 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28090 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
280a0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
280b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
280c0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
280d0 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
280e0 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
280f0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
28100 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28110 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28120 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
28130 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
28140 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
28150 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
28160 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
28170 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
28180 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
28190 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
281a0 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
281b0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
281c0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
281d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
281e0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
281f0 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
28200 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
28210 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
28220 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
28230 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
28240 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29  ewTrunk>mxPage )
28250 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  { .            r
28260 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
28270 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
28280 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
28290 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
282a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
282b0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65     testcase( iNe
282c0 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29  wTrunk==mxPage )
282d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
282e0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
282f0 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
28300 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
28310 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28320 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28330 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
28340 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
28350 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28360 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28370 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
28380 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
28390 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
283a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
283b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
283c0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
283d0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
283e0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
283f0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
28400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28410 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
28420 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
28430 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
28440 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
28450 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
28460 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
28470 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
28480 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
28490 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
284a0 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
284b0 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
284c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
284d0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
284e0 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
284f0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
28500 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
28510 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
28520 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
28530 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
28540 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
28550 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
28560 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
28570 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28580 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
28590 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
285a0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
285b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
285c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
285d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
285e0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
285f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
28600 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
28610 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
28620 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
28630 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
28640 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
28650 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
28660 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
28670 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
28680 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
28690 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
286a0 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
286b0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  dif.      }else 
286c0 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20  if( k>0 ){.     
286d0 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
286e0 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
286f0 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  unk */.        u
28700 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  32 closest;.    
28710 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
28720 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
28730 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
28740 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
28750 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
28760 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
28770 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20  u32 i;.         
28780 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
28790 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
287a0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74  ;.          dist
287b0 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
287c0 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
287d0 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
287e0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
287f0 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
28800 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
28810 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  d2 = sqlite3AbsI
28820 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
28830 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
28840 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
28850 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
28860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28870 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
28880 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
28890 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
288a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
288b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
288c0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
288d0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
288e0 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
288f0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
28900 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
28910 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
28920 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
28930 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
28940 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
28950 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
28960 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
28970 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
28980 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
28990 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
289a0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
289b0 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20  ( iPage==mxPage 
289c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
289d0 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50  searchList || iP
289e0 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age==nearby ){. 
289f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43           int noC
28a00 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  ontent;.        
28a10 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
28a20 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
28a30 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
28a40 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
28a50 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
28a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a70 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
28a80 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
28a90 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
28aa0 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
28ab0 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
28ac0 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
28ad0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
28ae0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
28af0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
28b00 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
28b10 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
28b20 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  age;.          i
28b30 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
28b40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
28b50 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
28b60 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
28b70 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
28b80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28b90 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
28ba0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
28bb0 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74         noContent
28bc0 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43   = !btreeGetHasC
28bd0 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67  ontent(pBt, *pPg
28be0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  no);.          r
28bf0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
28c00 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
28c10 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
28c20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
28c30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
28c50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
28c60 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
28c70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
28c80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28c90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28ca0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
28cb0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
28cc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28ce0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
28cf0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28d00 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
28d10 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
28d20 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
28d30 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
28d40 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
28d50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28d60 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
28d70 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
28d80 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65  elist, so create
28d90 20 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74   a new page at t
28da0 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66  he.    ** end of
28db0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
28dc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
28dd0 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
28de0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
28df0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
28e00 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e  rn rc;.    pBt->
28e10 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28  nPage++;.    if(
28e20 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
28e30 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
28e40 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65  Bt) ) pBt->nPage
28e50 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ++;..#ifndef SQL
28e60 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
28e70 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
28e80 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
28e90 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
28ea0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b  , pBt->nPage) ){
28eb0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
28ec0 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
28ed0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
28ee0 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
28ef0 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
28f00 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
28f10 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
28f20 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
28f30 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
28f40 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
28f50 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
28f60 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
28f70 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
28f80 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
28f90 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50     */.      MemP
28fa0 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
28fb0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
28fc0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
28fd0 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
28fe0 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
28ff0 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20   pBt->nPage));. 
29000 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
29010 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47  ->nPage!=PENDING
29020 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
29030 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  );.      rc = bt
29040 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
29050 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67  pBt->nPage, &pPg
29060 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
29070 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29080 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
29090 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
290a0 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
290b0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
290c0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  ge(pPg);.      }
290d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
290e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
290f0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
29100 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
29110 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
29120 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70  E_PAGE(pBt) ){ p
29130 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20  Bt->nPage++; }. 
29140 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
29150 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75  put4byte(28 + (u
29160 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  8*)pBt->pPage1->
29170 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67  aData, pBt->nPag
29180 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d  e);.    *pPgno =
29190 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20   pBt->nPage;..  
291a0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
291b0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
291c0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
291d0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
291e0 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
291f0 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 69  pPage, 1);.    i
29200 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
29210 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
29220 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
29230 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
29240 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
29250 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29260 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
29270 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
29280 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
29290 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
292a0 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67  of file\n", *pPg
292b0 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  no));.  }..  ass
292c0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
292d0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
292e0 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f  Bt) );..end_allo
292f0 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c  cate_page:.  rel
29300 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
29310 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
29320 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69  pPrevTrunk);.  i
29330 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29340 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
29350 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
29360 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
29370 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20  pDbPage)>1 ){.  
29380 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
29390 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
293a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
293b0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
293c0 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d  }.    (*ppPage)-
293d0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
293e0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
293f0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
29400 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
29410 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  OK || sqlite3Pag
29420 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a  erIswriteable((*
29430 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
29440 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
29450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
29460 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
29470 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61   to add page iPa
29480 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
29490 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73  se file free-lis
294a0 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  t. .** It is ass
294b0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61  umed that the pa
294c0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
294d0 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20  y a part of the 
294e0 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
294f0 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   The value passe
29500 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
29510 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
29520 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74   function is opt
29530 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  ional..** If the
29540 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20   caller happens 
29550 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65  to have a pointe
29560 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  r to the MemPage
29570 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72   object .** corr
29580 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
29590 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69  e iPage handy, i
295a0 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73  t may pass it as
295b0 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75   the second valu
295c0 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  e. .** Otherwise
295d0 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55  , it may pass NU
295e0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70  LL..**.** If a p
295f0 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50  ointer to a MemP
29600 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61  age object is pa
29610 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
29620 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
29630 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
29640 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72  unt is not alter
29650 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
29660 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
29670 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53  nt freePage2(BtS
29680 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50  hared *pBt, MemP
29690 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50  age *pMemPage, P
296a0 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65  gno iPage){.  Me
296b0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
296c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
296d0 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74    /* Free-list t
296e0 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50  runk page */.  P
296f0 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20  gno iTrunk = 0; 
29700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29710 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
29720 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74  r of free-list t
29730 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20  runk page */ .  
29740 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
29750 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20  = pBt->pPage1;  
29760 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66      /* Local ref
29770 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
29780 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
29790 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
297a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
297b0 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d  e being freed. M
297c0 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  ay be NULL. */. 
297d0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
297e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297f0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
29800 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ode */.  int nFr
29810 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
29820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29830 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
29840 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d  f pages on free-
29850 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
29860 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
29870 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
29880 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
29890 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65  Page>1 );.  asse
298a0 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c  rt( !pMemPage ||
298b0 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d   pMemPage->pgno=
298c0 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28  =iPage );..  if(
298d0 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20   pMemPage ){.   
298e0 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67   pPage = pMemPag
298f0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  e;.    sqlite3Pa
29900 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44  gerRef(pPage->pD
29910 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bPage);.  }else{
29920 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72  .    pPage = btr
29930 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
29940 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  , iPage);.  }.. 
29950 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
29960 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
29970 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
29980 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
29990 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
299a0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
299b0 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
299c0 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20  ge_out;.  nFree 
299d0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
299e0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
299f0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
29a00 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
29a10 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20  Free+1);..  if( 
29a20 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74  pBt->secureDelet
29a30 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  e ){.    /* If t
29a40 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
29a50 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
29a60 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ed, then.    ** 
29a70 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
29a80 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
29a90 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
29aa0 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  zeros..    */.  
29ab0 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
29ac0 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74   ((rc = btreeGet
29ad0 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
29ae0 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29   &pPage, 0))!=0)
29af0 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20   ).     ||      
29b00 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c        ((rc = sql
29b10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
29b20 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
29b30 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
29b40 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
29b50 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ut;.    }.    me
29b60 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
29b70 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
29b80 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
29b90 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
29ba0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
29bb0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
29bc0 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
29bd0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
29be0 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
29bf0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
29c00 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
29c10 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
29c20 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  {.    ptrmapPut(
29c30 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  pBt, iPage, PTRM
29c40 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
29c50 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
29c60 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
29c70 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
29c80 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74  Now manipulate t
29c90 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
29ca0 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72  se free-list str
29cb0 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72  ucture. There ar
29cc0 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69  e two.  ** possi
29cd0 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65  bilities. If the
29ce0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75   free-list is cu
29cf0 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f  rrently empty, o
29d00 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  r if the first. 
29d10 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69   ** trunk page i
29d20 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
29d30 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68  is full, then th
29d40 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
29d50 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66  ome a.  ** new f
29d60 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
29d70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
29d80 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  it will become a
29d90 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a   leaf of the.  *
29da0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  * first trunk pa
29db0 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ge in the curren
29dc0 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  t free-list. Thi
29dd0 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66  s block tests if
29de0 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
29df0 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20  ible to add the 
29e00 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72  page as a new fr
29e10 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20  ee-list leaf..  
29e20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d  */.  if( nFree!=
29e30 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65  0 ){.    u32 nLe
29e40 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
29e50 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
29e60 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c  mber of leaf cel
29e70 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  ls on trunk page
29e80 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20   */..    iTrunk 
29e90 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
29ea0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
29eb0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
29ec0 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
29ed0 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
29ee0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29ef0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
29f00 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
29f10 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65  ;.    }..    nLe
29f20 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  af = get4byte(&p
29f30 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
29f40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
29f50 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32  t->usableSize>32
29f60 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61   );.    if( nLea
29f70 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f > (u32)pBt->us
29f80 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29  ableSize/4 - 2 )
29f90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
29fa0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
29fb0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
29fc0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
29fd0 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c  .    if( nLeaf <
29fe0 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
29ff0 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
2a000 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
2a010 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f  case there is ro
2a020 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  om on the trunk 
2a030 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74  page to insert t
2a040 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
2a050 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
2a060 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20  a new leaf..    
2a070 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
2a080 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
2a090 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
2a0a0 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
2a0b0 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
2a0c0 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
2a0d0 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
2a0e0 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
2a0f0 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
2a100 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
2a110 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
2a120 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
2a130 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
2a140 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
2a150 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
2a160 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
2a170 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2a180 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
2a190 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
2a1a0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
2a1b0 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
2a1c0 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
2a1d0 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
2a1e0 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
2a1f0 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
2a200 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
2a210 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
2a220 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
2a230 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
2a240 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63  tinue to restric
2a250 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
2a260 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c  entries to usabl
2a270 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20  eSize/4 - 8.    
2a280 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41    ** for now.  A
2a290 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
2a2a0 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65  the future (once
2a2b0 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70   everyone has up
2a2c0 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20  graded.      ** 
2a2d0 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65  to 3.6.0 or late
2a2e0 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e  r) we should con
2a2f0 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65  sider fixing the
2a300 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
2a310 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ve.      ** to r
2a320 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f  ead "usableSize/
2a330 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  4-2" instead of 
2a340 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22  "usableSize/4-8"
2a350 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2a360 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2a370 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2a380 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2a390 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a3a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
2a3b0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2a3c0 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
2a3d0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
2a3e0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2a3f0 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
2a400 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2a410 66 28 20 70 50 61 67 65 20 26 26 20 21 70 42 74  f( pPage && !pBt
2a420 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 29  ->secureDelete )
2a430 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2a440 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
2a450 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2a460 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2a470 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53       rc = btreeS
2a480 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
2a490 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
2a4a0 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
2a4b0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
2a4c0 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
2a4d0 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
2a4e0 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
2a4f0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  );.      goto fr
2a500 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2a510 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  }.  }..  /* If c
2a520 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20  ontrol flows to 
2a530 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
2a540 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73   it was not poss
2a550 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a  ible to add the.
2a560 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65    ** the page be
2a570 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c  ing freed as a l
2a580 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20  eaf page of the 
2a590 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
2a5a0 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
2a5b0 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61  ** Possibly beca
2a5c0 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73  use the free-lis
2a5d0 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70  t is empty, or p
2a5e0 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
2a5f0 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20  the .  ** first 
2a600 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
2a610 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20  e-list is full. 
2a620 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
2a630 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
2a640 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d  .  ** will becom
2a650 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20  e the new first 
2a660 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2a670 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
2a680 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30  /.  if( pPage==0
2a690 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
2a6a0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2a6b0 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
2a6c0 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20  Page, 0)) ){.   
2a6d0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2a6e0 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  ut;.  }.  rc = s
2a6f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2a700 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2a710 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2a720 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
2a730 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2a740 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70    }.  put4byte(p
2a750 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72  Page->aData, iTr
2a760 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65  unk);.  put4byte
2a770 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34  (&pPage->aData[4
2a780 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74  ], 0);.  put4byt
2a790 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2a7a0 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  [32], iPage);.  
2a7b0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
2a7c0 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20  E: %d new trunk 
2a7d0 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25  page replacing %
2a7e0 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
2a7f0 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72  o, iTrunk));..fr
2a800 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  eepage_out:.  if
2a810 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70  ( pPage ){.    p
2a820 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
2a830 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
2a840 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
2a850 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
2a860 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2a870 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
2a880 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
2a890 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29  pPage, int *pRC)
2a8a0 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d  {.  if( (*pRC)==
2a8b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a8c0 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65   *pRC = freePage
2a8d0 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50  2(pPage->pBt, pP
2a8e0 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  age, pPage->pgno
2a8f0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2a900 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f  Free any overflo
2a910 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
2a920 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
2a930 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  n Cell..*/.stati
2a940 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28  c int clearCell(
2a950 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2a960 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2a970 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65  Cell){.  BtShare
2a980 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
2a990 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  pBt;.  CellInfo 
2a9a0 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  info;.  Pgno ovf
2a9b0 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
2a9c0 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20  .  int nOvfl;.  
2a9d0 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  u32 ovflPageSize
2a9e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2a9f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2aa00 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2aa10 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72  x) );.  btreePar
2aa20 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2aa30 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
2aa40 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
2aa50 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72  flow==0 ){.    r
2aa60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2aa70 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
2aa80 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
2aa90 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
2aaa0 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  thing */.  }.  i
2aab0 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f  f( pCell+info.iO
2aac0 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50 61 67  verflow+3 > pPag
2aad0 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
2aae0 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20 20 20  maskPage ){.    
2aaf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2ab00 52 52 55 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20  RRUPT;  /* Cell 
2ab10 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64  extends past end
2ab20 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a   of page */.  }.
2ab30 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
2ab40 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
2ab50 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
2ab60 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
2ab70 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a  ableSize > 4 );.
2ab80 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d    ovflPageSize =
2ab90 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2aba0 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20   - 4;.  nOvfl = 
2abb0 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d  (info.nPayload -
2abc0 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f   info.nLocal + o
2abd0 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29  vflPageSize - 1)
2abe0 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20  /ovflPageSize;. 
2abf0 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e   assert( ovflPgn
2ac00 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20  o==0 || nOvfl>0 
2ac10 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
2ac20 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
2ac30 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
2ac40 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
2ac50 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
2ac60 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
2ac70 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
2ac80 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
2ac90 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
2aca0 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
2acb0 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
2acc0 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
2acd0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
2ace0 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
2acf0 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
2ad00 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
2ad10 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
2ad20 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
2ad30 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
2ad40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ad50 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2ad60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
2ad70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
2ad80 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
2ad90 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
2ada0 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
2adb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2adc0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2add0 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
2ade0 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
2adf0 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
2ae00 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
2ae10 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
2ae20 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
2ae30 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
2ae40 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
2ae50 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
2ae60 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
2ae70 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
2ae80 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
2ae90 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
2aea0 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
2aeb0 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
2aec0 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
2aed0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
2aee0 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
2aef0 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
2af00 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
2af10 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
2af20 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
2af30 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
2af40 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
2af50 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
2af60 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
2af70 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
2af80 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
2af90 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
2afa0 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
2afb0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
2afc0 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
2afd0 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
2afe0 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
2aff0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
2b000 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
2b010 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
2b020 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
2b030 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
2b040 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
2b050 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
2b060 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
2b070 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
2b080 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
2b090 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
2b0a0 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
2b0b0 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
2b0c0 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
2b0d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2b0e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2b0f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2b100 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
2b110 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
2b120 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
2b130 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
2b140 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2b150 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
2b160 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
2b170 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2b180 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
2b190 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
2b1a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b1b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
2b1c0 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
2b1d0 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
2b1e0 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
2b1f0 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
2b200 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
2b210 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
2b220 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
2b230 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
2b240 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
2b250 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
2b260 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
2b270 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
2b280 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
2b290 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
2b2a0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
2b2b0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
2b2c0 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
2b2d0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
2b2e0 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
2b2f0 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
2b300 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
2b310 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
2b320 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
2b330 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
2b340 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
2b350 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
2b360 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
2b370 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
2b380 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
2b390 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
2b3a0 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
2b3b0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2b3c0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
2b3d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b3f0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
2b400 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
2b410 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
2b420 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
2b430 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
2b440 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
2b450 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
2b460 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
2b470 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
2b480 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
2b490 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
2b4a0 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
2b4b0 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
2b4c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b4d0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
2b4e0 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
2b4f0 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
2b500 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
2b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b520 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
2b530 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
2b540 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
2b550 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
2b560 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
2b570 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
2b580 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
2b590 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
2b5a0 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
2b5b0 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
2b5c0 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
2b5d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2b5e0 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
2b5f0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
2b600 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
2b610 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
2b620 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65  nt nHeader;.  Ce
2b630 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  llInfo info;..  
2b640 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2b650 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2b660 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2b670 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
2b680 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
2b690 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20  writeable since 
2b6a0 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61  pCell might be a
2b6b0 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75  uxiliary.  ** bu
2b6c0 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20  ffer space that 
2b6d0 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d  is separate from
2b6e0 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65   the pPage buffe
2b6f0 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65  r area */.  asse
2b700 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d  rt( pCell<pPage-
2b710 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e  >aData || pCell>
2b720 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
2b730 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
2b740 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
2b750 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2b760 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2b770 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  age) );..  /* Fi
2b780 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ll in the header
2b790 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d  . */.  nHeader =
2b7a0 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   0;.  if( !pPage
2b7b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48  ->leaf ){.    nH
2b7c0 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a  eader += 4;.  }.
2b7d0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
2b7e0 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61  Data ){.    nHea
2b7f0 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
2b800 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
2b810 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a  , nData+nZero);.
2b820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61    }else{.    nDa
2b830 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a  ta = nZero = 0;.
2b840 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d    }.  nHeader +=
2b850 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
2b860 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
2b870 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72  4*)&nKey);.  btr
2b880 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
2b890 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
2b8a0 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  fo);.  assert( i
2b8b0 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65  nfo.nHeader==nHe
2b8c0 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ader );.  assert
2b8d0 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
2b8e0 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  y );.  assert( i
2b8f0 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29  nfo.nData==(u32)
2b900 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b  (nData+nZero) );
2b910 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
2b920 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a   the payload */.
2b930 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
2b940 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66  ta + nZero;.  if
2b950 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
2b960 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44  ){.    pSrc = pD
2b970 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
2b980 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61  nData;.    nData
2b990 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a   = 0;.  }else{ .
2b9a0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b      if( NEVER(nK
2b9b0 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c  ey>0x7fffffff ||
2b9c0 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20   pKey==0) ){.   
2b9d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b9e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2b9f0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
2ba00 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  d += (int)nKey;.
2ba10 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b      pSrc = pKey;
2ba20 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74  .    nSrc = (int
2ba30 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e  )nKey;.  }.  *pn
2ba40 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a  Size = info.nSiz
2ba50 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d  e;.  spaceLeft =
2ba60 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20   info.nLocal;.  
2ba70 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
2ba80 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50  l[nHeader];.  pP
2ba90 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e  rior = &pCell[in
2baa0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a  fo.iOverflow];..
2bab0 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
2bac0 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
2bad0 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
2bae0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2baf0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2bb00 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
2bb10 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
2bb20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
2bb30 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2bb40 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
2bb50 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
2bb60 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
2bb70 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
2bb80 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
2bb90 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
2bba0 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
2bbb0 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
2bbc0 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
2bbd0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2bbe0 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
2bbf0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
2bc00 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
2bc10 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2bc20 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
2bc30 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
2bc40 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
2bc50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2bc60 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
2bc70 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
2bc80 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
2bc90 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
2bca0 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
2bcb0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
2bcc0 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
2bcd0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
2bce0 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
2bcf0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
2bd00 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
2bd10 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
2bd20 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
2bd30 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
2bd40 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
2bd50 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
2bd60 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
2bd70 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
2bd80 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
2bd90 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
2bda0 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
2bdb0 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
2bdc0 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
2bdd0 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
2bde0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
2bdf0 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
2be00 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
2be10 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
2be20 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e  alised values an
2be30 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
2be40 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
2be50 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
2be60 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
2be70 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
2be80 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
2be90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bea0 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
2beb0 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
2bec0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
2bed0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
2bee0 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
2bef0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
2bf00 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
2bf10 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
2bf20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2bf30 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2bf40 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
2bf50 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
2bf60 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
2bf70 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2bf80 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
2bf90 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2bfa0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
2bfb0 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
2bfc0 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
2bfd0 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
2bfe0 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
2bff0 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
2c000 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
2c010 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
2c020 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
2c030 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
2c040 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
2c050 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
2c060 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2c070 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
2c080 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
2c090 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
2c0a0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
2c0b0 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
2c0c0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
2c0d0 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
2c0e0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2c0f0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
2c100 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
2c110 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
2c120 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
2c130 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
2c140 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2c150 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2c160 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2c170 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2c180 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
2c190 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
2c1a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2c1b0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
2c1c0 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
2c1d0 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
2c1e0 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
2c1f0 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
2c200 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
2c210 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
2c220 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
2c230 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
2c240 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
2c250 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
2c260 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
2c270 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
2c280 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
2c290 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
2c2a0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
2c2b0 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
2c2c0 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
2c2d0 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
2c2e0 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
2c2f0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
2c300 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
2c310 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
2c320 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2c330 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
2c340 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2c350 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
2c360 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
2c370 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
2c380 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
2c390 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
2c3a0 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
2c3b0 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
2c3c0 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
2c3d0 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
2c3e0 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
2c3f0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
2c400 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
2c410 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
2c420 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
2c430 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2c440 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2c450 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2c460 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
2c470 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
2c480 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
2c490 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
2c4a0 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
2c4b0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
2c4c0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
2c4d0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
2c4e0 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
2c4f0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
2c500 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
2c510 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
2c520 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
2c530 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
2c540 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
2c550 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a   if( nSrc==0 ){.
2c560 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61        nSrc = nDa
2c570 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d  ta;.      pSrc =
2c580 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
2c590 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
2c5a0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
2c5b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2c5c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
2c5d0 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
2c5e0 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
2c5f0 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
2c600 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
2c610 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
2c620 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
2c630 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
2c640 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
2c650 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
2c660 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
2c670 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
2c680 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
2c690 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
2c6a0 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
2c6b0 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
2c6c0 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
2c6d0 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
2c6e0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2c6f0 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
2c700 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
2c710 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
2c720 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
2c730 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29  nt sz, int *pRC)
2c740 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  {.  u32 pc;     
2c750 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
2c760 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
2c770 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
2c780 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
2c790 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
2c7a0 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
2c7b0 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
2c7c0 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
2c7d0 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
2c7e0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
2c7f0 20 2a 65 6e 64 50 74 72 3b 20 20 20 20 20 2f 2a   *endPtr;     /*
2c800 20 45 6e 64 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a   End of loop */.
2c810 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2c820 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
2c830 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64  code */.  int hd
2c840 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  r;        /* Beg
2c850 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65  inning of the he
2c860 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61  ader.  0 most pa
2c870 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31  ges.  100 page 1
2c880 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
2c890 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
2c8a0 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
2c8b0 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
2c8c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
2c8d0 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
2c8e0 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
2c8f0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2c900 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2c910 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2c920 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2c930 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2c940 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2c950 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
2c960 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20  >aData;.  ptr = 
2c970 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  &pPage->aCellIdx
2c980 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20  [2*idx];.  pc = 
2c990 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
2c9a0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
2c9b0 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63  rOffset;.  testc
2c9c0 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74  ase( pc==get2byt
2c9d0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
2c9e0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2c9f0 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz==pPage->pBt
2ca00 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
2ca10 20 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29    if( pc < (u32)
2ca20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2ca30 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20  dr+5]) || pc+sz 
2ca40 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  > pPage->pBt->us
2ca50 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
2ca60 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
2ca70 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2ca80 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
2ca90 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61   = freeSpace(pPa
2caa0 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69  ge, pc, sz);.  i
2cab0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( rc ){.    *pR
2cac0 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
2cad0 72 6e 3b 0a 20 20 7d 0a 20 20 65 6e 64 50 74 72  rn;.  }.  endPtr
2cae0 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c   = &pPage->aCell
2caf0 49 64 78 5b 32 2a 70 50 61 67 65 2d 3e 6e 43 65  Idx[2*pPage->nCe
2cb00 6c 6c 20 2d 20 32 5d 3b 0a 20 20 61 73 73 65 72  ll - 2];.  asser
2cb10 74 28 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54  t( (SQLITE_PTR_T
2cb20 4f 5f 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30  O_INT(ptr)&1)==0
2cb30 20 29 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61   );  /* ptr is a
2cb40 6c 77 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69  lways 2-byte ali
2cb50 67 6e 65 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28  gned */.  while(
2cb60 20 70 74 72 3c 65 6e 64 50 74 72 20 29 7b 0a 20   ptr<endPtr ){. 
2cb70 20 20 20 2a 28 75 31 36 2a 29 70 74 72 20 3d 20     *(u16*)ptr = 
2cb80 2a 28 75 31 36 2a 29 26 70 74 72 5b 32 5d 3b 0a  *(u16*)&ptr[2];.
2cb90 20 20 20 20 70 74 72 20 2b 3d 20 32 3b 0a 20 20      ptr += 2;.  
2cba0 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
2cbb0 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  --;.  put2byte(&
2cbc0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
2cbd0 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50  ge->nCell);.  pP
2cbe0 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
2cbf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
2cc00 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
2cc10 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
2cc20 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
2cc30 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
2cc40 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
2cc50 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
2cc60 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
2cc70 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
2cc80 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
2cc90 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
2cca0 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
2ccb0 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
2ccc0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
2ccd0 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
2cce0 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
2ccf0 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
2cd00 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
2cd10 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
2cd20 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
2cd30 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  >aOvfl[] and mak
2cd40 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
2cd50 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
2cd60 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
2cd70 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
2cd80 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
2cd90 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
2cda0 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
2cdb0 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
2cdc0 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
2cdd0 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
2cde0 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
2cdf0 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
2ce00 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b  ed..**.** If nSk
2ce10 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
2ce20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79  then do not copy
2ce30 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
2ce40 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a   bytes of the.**
2ce50 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65   cell. The calle
2ce60 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  r will overwrite
2ce70 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73   them after this
2ce80 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2ce90 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69  s. If.** nSkip i
2cea0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2ceb0 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70   pCell may not p
2cec0 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c  oint to an inval
2ced0 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  id memory locati
2cee0 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c  on .** (but pCel
2cef0 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79  l+nSkip is alway
2cf00 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61  s valid)..*/.sta
2cf10 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
2cf20 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
2cf30 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
2cf40 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
2cf50 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
2cf60 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
2cf70 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
2cf80 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
2cf90 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
2cfa0 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
2cfb0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
2cfc0 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
2cfd0 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
2cfe0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
2cff0 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
2d000 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
2d010 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
2d020 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
2d030 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
2d040 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
2d050 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
2d060 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
2d070 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
2d080 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
2d090 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
2d0a0 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
2d0b0 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
2d0c0 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
2d0d0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2d0e0 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  idx = 0;      /*
2d0f0 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
2d100 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
2d110 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2d120 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
2d130 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2d140 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20  r */.  int end; 
2d150 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2d160 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
2d170 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  last cell pointe
2d180 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
2d190 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20   int ins;       
2d1a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64     /* Index in d
2d1b0 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20  ata[] where new 
2d1c0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  cell pointer is 
2d1d0 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
2d1e0 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
2d1f0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69  /* Address of fi
2d200 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
2d210 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2d220 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
2d230 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
2d240 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
2d250 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ge */.  u8 *ptr;
2d260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2d270 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66  d for moving inf
2d280 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20  ormation around 
2d290 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
2d2a0 38 20 2a 65 6e 64 50 74 72 3b 20 20 20 20 20 20  8 *endPtr;      
2d2b0 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c   /* End of the l
2d2c0 6f 6f 70 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53  oop */..  int nS
2d2d0 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20  kip = (iChild ? 
2d2e0 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a  4 : 0);..  if( *
2d2f0 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
2d300 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
2d310 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
2d320 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
2d330 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w );.  assert( p
2d340 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
2d350 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2d360 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
2d370 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29  e->pBt)<=10921 )
2d380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2d390 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72  e->nOverflow<=Ar
2d3a0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
2d3b0 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Ovfl) );.  asser
2d3c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2d3d0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2d3e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
2d3f0 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64   The cell should
2d400 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a   normally be siz
2d410 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48  ed correctly.  H
2d420 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76  owever, when mov
2d430 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f  ing a.  ** malfo
2d440 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61  rmed cell from a
2d450 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e   leaf page to an
2d460 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20   interior page, 
2d470 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65  if the cell size
2d480 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20  .  ** wanted to 
2d490 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  be less than 4 b
2d4a0 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75  ut got rounded u
2d4b0 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65  p to 4 on the le
2d4c0 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20  af, then size.  
2d4d0 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73  ** might be less
2d4e0 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69   than 8 (leaf-si
2d4f0 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e  ze + pointer) on
2d500 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f   the interior no
2d510 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20  de.  Hence.  ** 
2d520 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74  the term after t
2d530 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c  he || in the fol
2d540 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
2d550 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a   */.  assert( sz
2d560 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
2d570 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28  age, pCell) || (
2d580 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e  sz==8 && iChild>
2d590 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  0) );.  if( pPag
2d5a0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
2d5b0 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
2d5c0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
2d5d0 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
2d5e0 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20  py(pTemp+nSkip, 
2d5f0 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
2d600 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43  nSkip);.      pC
2d610 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
2d620 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c   }.    if( iChil
2d630 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
2d640 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c  yte(pCell, iChil
2d650 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  d);.    }.    j 
2d660 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
2d670 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74  ow++;.    assert
2d680 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  ( j<(int)(sizeof
2d690 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73  (pPage->aOvfl)/s
2d6a0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
2d6b0 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70  fl[0])) );.    p
2d6c0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70  Page->aOvfl[j].p
2d6d0 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Cell = pCell;.  
2d6e0 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
2d6f0 5d 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a  ].idx = (u16)i;.
2d700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
2d710 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2d720 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2d730 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2d740 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d750 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72  {.      *pRC = r
2d760 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
2d770 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2d780 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2d790 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2d7a0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2d7b0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
2d7c0 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f  aData;.    cellO
2d7d0 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
2d7e0 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
2d7f0 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
2d800 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
2d810 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c  ;.    ins = cell
2d820 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20  Offset + 2*i;.  
2d830 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53    rc = allocateS
2d840 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20  pace(pPage, sz, 
2d850 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72  &idx);.    if( r
2d860 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20  c ){ *pRC = rc; 
2d870 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a  return; }.    /*
2d880 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61   The allocateSpa
2d890 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61  ce() routine gua
2d8a0 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c  rantees the foll
2d8b0 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72  owing two proper
2d8c0 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  ties.    ** if i
2d8d0 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  t returns succes
2d8e0 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  s */.    assert(
2d8f0 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b   idx >= end+2 );
2d900 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
2d910 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  +sz <= (int)pPag
2d920 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2d930 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ze );.    pPage-
2d940 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50  >nCell++;.    pP
2d950 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75  age->nFree -= (u
2d960 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20  16)(2 + sz);.   
2d970 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64   memcpy(&data[id
2d980 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b  x+nSkip], pCell+
2d990 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
2d9a0 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  ;.    if( iChild
2d9b0 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
2d9c0 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69  te(&data[idx], i
2d9d0 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
2d9e0 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 65 6e    ptr = &data[en
2d9f0 64 5d 3b 0a 20 20 20 20 65 6e 64 50 74 72 20 3d  d];.    endPtr =
2da00 20 26 64 61 74 61 5b 69 6e 73 5d 3b 0a 20 20 20   &data[ins];.   
2da10 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45   assert( (SQLITE
2da20 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 74 72 29  _PTR_TO_INT(ptr)
2da30 26 31 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 70 74  &1)==0 );  /* pt
2da40 72 20 69 73 20 61 6c 77 61 79 73 20 32 2d 62 79  r is always 2-by
2da50 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20 20  te aligned */.  
2da60 20 20 77 68 69 6c 65 28 20 70 74 72 3e 65 6e 64    while( ptr>end
2da70 50 74 72 20 29 7b 0a 20 20 20 20 20 20 2a 28 75  Ptr ){.      *(u
2da80 31 36 2a 29 70 74 72 20 3d 20 2a 28 75 31 36 2a  16*)ptr = *(u16*
2da90 29 26 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20  )&ptr[-2];.     
2daa0 20 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 7d   ptr -= 2;.    }
2dab0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
2dac0 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a  ata[ins], idx);.
2dad0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
2dae0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2daf0 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  set+3], pPage->n
2db00 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  Cell);.#ifndef S
2db10 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2db20 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
2db30 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  age->pBt->autoVa
2db40 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  cuum ){.      /*
2db50 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f   The cell may co
2db60 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  ntain a pointer 
2db70 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
2db80 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74  age. If so, writ
2db90 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65  e.      ** the e
2dba0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
2dbb0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20  rflow page into 
2dbc0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
2dbd0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2dbe0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
2dbf0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
2dc00 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  RC);.    }.#endi
2dc10 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  f.  }.}../*.** A
2dc20 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c  dd a list of cel
2dc30 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54  ls to a page.  T
2dc40 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62  he page should b
2dc50 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  e initially empt
2dc60 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20  y..** The cells 
2dc70 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
2dc80 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  o fit on the pag
2dc90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2dca0 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a  d assemblePage(.
2dcb0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2dcc0 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ,   /* The page 
2dcd0 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64  to be assemblied
2dce0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
2dcf0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
2dd00 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
2dd10 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61  o add to this pa
2dd20 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
2dd30 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  ell,      /* Poi
2dd40 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f  nters to cell bo
2dd50 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61  dies */.  u16 *a
2dd60 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53  Size        /* S
2dd70 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  izes of the cell
2dd80 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
2dd90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2dda0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2ddb0 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20   u8 *pCellptr;  
2ddc0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2ddd0 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
2dde0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
2ddf0 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
2de00 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
2de10 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
2de20 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
2de30 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
2de40 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2de50 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70  er to data for p
2de60 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Page */.  const 
2de70 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
2de80 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
2de90 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2dea0 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61  of header on pPa
2deb0 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ge */.  const in
2dec0 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67  t nUsable = pPag
2ded0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2dee0 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69  ze; /* Usable si
2def0 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20  ze of page */.. 
2df00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2df10 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
2df20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2df30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2df40 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2df50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  );.  assert( nCe
2df60 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d  ll>=0 && nCell<=
2df70 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61  (int)MX_CELL(pPa
2df80 67 65 2d 3e 70 42 74 29 0a 20 20 20 20 20 20 20  ge->pBt).       
2df90 20 20 20 20 20 26 26 20 28 69 6e 74 29 4d 58 5f       && (int)MX_
2dfa0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2dfb0 3c 3d 31 30 39 32 31 29 3b 0a 20 20 61 73 73 65  <=10921);.  asse
2dfc0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2dfd0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2dfe0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2dff0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2e000 74 68 65 20 70 61 67 65 20 68 61 73 20 6a 75 73  the page has jus
2e010 74 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79  t been zeroed by
2e020 20 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20   zeroPage() */. 
2e030 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2e040 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  nCell==0 );.  as
2e050 73 65 72 74 28 20 67 65 74 32 62 79 74 65 4e 6f  sert( get2byteNo
2e060 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
2e070 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a  5])==nUsable );.
2e080 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70  .  pCellptr = &p
2e090 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e  Page->aCellIdx[n
2e0a0 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62  Cell*2];.  cellb
2e0b0 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20  ody = nUsable;. 
2e0c0 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20   for(i=nCell-1; 
2e0d0 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
2e0e0 75 31 36 20 73 7a 20 3d 20 61 53 69 7a 65 5b 69  u16 sz = aSize[i
2e0f0 5d 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  ];.    pCellptr 
2e100 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f  -= 2;.    cellbo
2e110 64 79 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 70 75  dy -= sz;.    pu
2e120 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c  t2byte(pCellptr,
2e130 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20   cellbody);.    
2e140 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c  memcpy(&data[cel
2e150 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69  lbody], apCell[i
2e160 5d 2c 20 73 7a 29 3b 0a 20 20 7d 0a 20 20 70 75  ], sz);.  }.  pu
2e170 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2e180 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70  +3], nCell);.  p
2e190 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2e1a0 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b  r+5], cellbody);
2e1b0 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
2e1c0 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55  -= (nCell*2 + nU
2e1d0 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79  sable - cellbody
2e1e0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
2e1f0 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a  l = (u16)nCell;.
2e200 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
2e210 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72  lowing parameter
2e220 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20  s determine how 
2e230 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61  many adjacent pa
2e240 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64  ges get involved
2e250 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69  .** in a balanci
2e260 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
2e270 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
2e280 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
2e290 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f  either side.** o
2e2a0 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
2e2b0 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
2e2c0 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65  he balancing ope
2e2d0 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74  ration.  NB is t
2e2e0 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62  he.** total numb
2e2f0 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
2e300 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e   participate, in
2e310 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67  cluding the targ
2e320 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e  et page and.** N
2e330 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  N neighbors on e
2e340 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a  ither side..**.*
2e350 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61  * The minimum va
2e360 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28  lue of NN is 1 (
2e370 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63  of course).  Inc
2e380 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65  reasing NN above
2e390 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33   1.** (to 2 or 3
2e3a0 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74  ) gives a modest
2e3b0 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20   improvement in 
2e3c0 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54  SELECT and DELET
2e3d0 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  E performance.**
2e3e0 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72   in exchange for
2e3f0 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64   a larger degrad
2e400 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20  ation in INSERT 
2e410 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f  and UPDATE perfo
2e420 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76  rmance..** The v
2e430 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61  alue of NN appea
2e440 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62  rs to give the b
2e450 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72  est results over
2e460 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  all..*/.#define 
2e470 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20  NN 1            
2e480 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
2e490 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
2e4a0 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20  r side of pPage 
2e4b0 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e  */.#define NB (N
2e4c0 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54  N*2+1)      /* T
2e4d0 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c  otal pages invol
2e4e0 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ved in the balan
2e4f0 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ce */...#ifndef 
2e500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
2e510 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54  KBALANCE./*.** T
2e520 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62  his version of b
2e530 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73  alance() handles
2e540 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63   the common spec
2e550 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a  ial case where.*
2e560 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73  * a new entry is
2e570 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
2e580 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  on the extreme r
2e590 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a  ight-end of the.
2e5a0 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65  ** tree, in othe
2e5b0 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68  r words, when th
2e5c0 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c  e new entry will
2e5d0 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67   become the larg
2e5e0 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  est.** entry in 
2e5f0 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  the tree..**.** 
2e600 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e  Instead of tryin
2e610 67 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68 65  g to balance the
2e620 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65   3 right-most le
2e630 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61  af pages, just a
2e640 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65  dd.** a new page
2e650 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61   to the right-ha
2e660 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20  nd side and put 
2e670 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72  the one new entr
2e680 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67  y in.** that pag
2e690 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20  e.  This leaves 
2e6a0 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
2e6b0 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77  f the tree somew
2e6c0 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65  hat.** unbalance
2e6d0 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65  d.  But odds are
2e6e0 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
2e6f0 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65   inserting new e
2e700 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65  ntries.** at the
2e710 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77   end soon afterw
2e720 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72  ards so the near
2e730 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  ly empty page wi
2e740 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69  ll quickly.** fi
2e750 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61  ll up.  On avera
2e760 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20  ge..**.** pPage 
2e770 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  is the leaf page
2e780 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69   which is the ri
2e790 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e  ght-most page in
2e7a0 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50   the tree..** pP
2e7b0 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72  arent is its par
2e7c0 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74  ent.  pPage must
2e7d0 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f   have a single o
2e7e0 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a  verflow entry.**
2e7f0 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74   which is also t
2e800 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
2e810 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  try on the page.
2e820 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63  .**.** The pSpac
2e830 65 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  e buffer is used
2e840 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70   to store a temp
2e850 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68  orary copy of th
2e860 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c  e divider.** cel
2e870 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69  l that will be i
2e880 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61  nserted into pPa
2e890 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c  rent. Such a cel
2e8a0 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
2e8b0 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e  4.** byte page n
2e8c0 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62  umber followed b
2e8d0 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  y a variable len
2e8e0 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20  gth integer. In 
2e8f0 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
2e900 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73  at most 13 bytes
2e910 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61  . Hence the pSpa
2e920 63 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  ce buffer must b
2e930 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33  e at.** least 13
2e940 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
2e950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2e960 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50  lance_quick(MemP
2e970 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65  age *pParent, Me
2e980 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
2e990 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53   *pSpace){.  BtS
2e9a0 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74  hared *const pBt
2e9b0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20   = pPage->pBt;  
2e9c0 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61    /* B-Tree Data
2e9d0 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  base */.  MemPag
2e9e0 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  e *pNew;        
2e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ea00 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
2ea10 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  d page */.  int 
2ea20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea40 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
2ea50 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
2ea60 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
2ea70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2ea80 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77  e number of pNew
2ea90 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
2eaa0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2eab0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2eac0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2ead0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2eae0 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
2eaf0 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
2eb00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2eb10 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
2eb20 0a 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72  .  /* This error
2eb30 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f   condition is no
2eb40 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74  w caught prior t
2eb50 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20  o reaching this 
2eb60 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
2eb70 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d  ( pPage->nCell<=
2eb80 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2eb90 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2eba0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
2ebb0 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73 20   new page. This 
2ebc0 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
2ebd0 20 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69   the right-sibli
2ebe0 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67  ng of .  ** pPag
2ebf0 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65  e. Make the pare
2ec00 6e 74 20 70 61 67 65 20 77 72 69 74 61 62 6c 65  nt page writable
2ec10 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  , so that the ne
2ec20 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20  w divider cell. 
2ec30 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72   ** may be inser
2ec40 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65  ted. If both the
2ec50 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  se operations ar
2ec60 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72  e successful, pr
2ec70 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63  oceed..  */.  rc
2ec80 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2ec90 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
2eca0 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29   &pgnoNew, 0, 0)
2ecb0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
2ecc0 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75  ITE_OK ){..    u
2ecd0 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63  8 *pOut = &pSpac
2ece0 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43  e[4];.    u8 *pC
2ecf0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76  ell = pPage->aOv
2ed00 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20  fl[0].pCell;.   
2ed10 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65   u16 szCell = ce
2ed20 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2ed30 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20   pCell);.    u8 
2ed40 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73  *pStop;..    ass
2ed50 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2ed60 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65  rIswriteable(pNe
2ed70 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  w->pDbPage) );. 
2ed80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ed90 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46  ->aData[0]==(PTF
2eda0 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
2edb0 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29  DATA|PTF_LEAF) )
2edc0 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
2edd0 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  New, PTF_INTKEY|
2ede0 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
2edf0 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65  _LEAF);.    asse
2ee00 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31  mblePage(pNew, 1
2ee10 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c  , &pCell, &szCel
2ee20 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  l);..    /* If t
2ee30 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
2ee40 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
2ee50 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
2ee60 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69  er map.    ** wi
2ee70 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  th entries for t
2ee80 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64  he new page, and
2ee90 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f   any pointer fro
2eea0 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65  m the .    ** ce
2eeb0 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ll on the page t
2eec0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
2eed0 67 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66  ge. If either of
2eee0 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70   these.    ** op
2eef0 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20  erations fails, 
2ef00 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
2ef10 69 73 20 73 65 74 2c 20 62 75 74 20 74 68 65 20  is set, but the 
2ef20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20  contents.    ** 
2ef30 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  of the parent pa
2ef40 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e  ge are still man
2ef50 69 70 75 6c 61 74 65 64 20 62 79 20 74 68 68 20  ipulated by thh 
2ef60 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20  code below..    
2ef70 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61  ** That is Ok, a
2ef80 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
2ef90 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20   parent page is 
2efa0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20  guaranteed to.  
2efb0 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61    ** be marked a
2efc0 73 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69  s dirty. Returni
2efd0 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
2efe0 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20   will cause a.  
2eff0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75    ** rollback, u
2f000 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67  ndoing any chang
2f010 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70  es made to the p
2f020 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
2f030 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
2f040 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2f050 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2f060 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f  pgnoNew, PTRMAP_
2f070 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
2f080 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
2f090 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65    if( szCell>pNe
2f0a0 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20  w->minLocal ){. 
2f0b0 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
2f0c0 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43  OvflPtr(pNew, pC
2f0d0 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  ell, &rc);.     
2f0e0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
2f0f0 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69 76 69  /* Create a divi
2f100 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65  der cell to inse
2f110 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  rt into pParent.
2f120 20 54 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   The divider cel
2f130 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74  l.    ** consist
2f140 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61  s of a 4-byte pa
2f150 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70  ge number (the p
2f160 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50  age number of pP
2f170 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20  age) and.    ** 
2f180 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2f190 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69  h key value (whi
2f1a0 63 68 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  ch must be the s
2f1b0 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68 65  ame value as the
2f1c0 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  .    ** largest 
2f1d0 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20  key on pPage).. 
2f1e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20     **.    ** To 
2f1f0 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74  find the largest
2f200 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50   key value on pP
2f210 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20  age, first find 
2f220 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a  the right-most .
2f230 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
2f240 50 61 67 65 2e 20 54 68 65 20 66 69 72 73 74 20  Page. The first 
2f250 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  two fields of th
2f260 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20  is cell are the 
2f270 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c  .    ** record-l
2f280 65 6e 67 74 68 20 28 61 20 76 61 72 69 61 62 6c  ength (a variabl
2f290 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
2f2a0 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73   at most 32-bits
2f2b0 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a   in size).    **
2f2c0 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c   and the key val
2f2d0 75 65 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c  ue (a variable l
2f2e0 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d  ength integer, m
2f2f0 61 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75  ay have any valu
2f300 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66  e)..    ** The f
2f310 69 72 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c  irst of the whil
2f320 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c  e(...) loops bel
2f330 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68  ow skips over th
2f340 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a  e record-length.
2f350 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68      ** field. Th
2f360 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e  e second while(.
2f370 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20  ..) loop copies 
2f380 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72  the key value fr
2f390 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65  om the.    ** ce
2f3a0 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f  ll on pPage into
2f3b0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
2f3c0 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  er..    */.    p
2f3d0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
2f3e0 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43  pPage, pPage->nC
2f3f0 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f  ell-1);.    pSto
2f400 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20  p = &pCell[9];. 
2f410 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65     while( (*(pCe
2f420 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70  ll++)&0x80) && p
2f430 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20  Cell<pStop );.  
2f440 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c    pStop = &pCell
2f450 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
2f460 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28  ((*(pOut++) = *(
2f470 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20  pCell++))&0x80) 
2f480 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29  && pCell<pStop )
2f490 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  ;..    /* Insert
2f4a0 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72   the new divider
2f4b0 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65   cell into pPare
2f4c0 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72  nt. */.    inser
2f4d0 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  tCell(pParent, p
2f4e0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70  Parent->nCell, p
2f4f0 53 70 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75  Space, (int)(pOu
2f500 74 2d 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20  t-pSpace),.     
2f510 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 50 61            0, pPa
2f520 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ge->pgno, &rc);.
2f530 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
2f540 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e  right-child poin
2f550 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74  ter of pParent t
2f560 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
2f570 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
2f580 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  put4byte(&pParen
2f590 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
2f5a0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
2f5b0 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20  pgnoNew);.  .   
2f5c0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
2f5d0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
2f5e0 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20   new page. */.  
2f5f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
2f600 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ew);.  }..  retu
2f610 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
2f620 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  /* SQLITE_OMIT_Q
2f630 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a  UICKBALANCE */..
2f640 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73  #if 0./*.** This
2f650 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
2f660 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e  ot contribute an
2f670 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70  ything to the op
2f680 65 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74  eration of SQLit
2f690 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65  e..** it is some
2f6a0 74 69 6d 65 73 20 61 63 74 69 76 61 74 65 64 20  times activated 
2f6b0 74 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c  temporarily whil
2f6c0 65 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65  e debugging code
2f6d0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a   responsible .**
2f6e0 20 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69   for setting poi
2f6f0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2f700 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f710 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
2f720 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67  (MemPage **apPag
2f730 65 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20  e, int nPage){. 
2f740 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72   int i, j;.  for
2f750 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69  (i=0; i<nPage; i
2f760 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b  ++){.    Pgno n;
2f770 0a 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d  .    u8 e;.    M
2f780 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2f790 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42  apPage[i];.    B
2f7a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2f7b0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61  Page->pBt;.    a
2f7c0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2f7d0 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72  Init );..    for
2f7e0 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e  (j=0; j<pPage->n
2f7f0 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Cell; j++){.    
2f800 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
2f810 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20  .      u8 *z;.  
2f820 20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69     .      z = fi
2f830 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29  ndCell(pPage, j)
2f840 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72  ;.      btreePar
2f850 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2f860 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20   z, &info);.    
2f870 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
2f880 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
2f890 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34  Pgno ovfl = get4
2f8a0 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76  byte(&z[info.iOv
2f8b0 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20  erflow]);.      
2f8c0 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
2f8d0 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a   ovfl, &e, &n);.
2f8e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f8f0 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
2f900 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  & e==PTRMAP_OVER
2f910 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d  FLOW1 );.      }
2f920 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
2f930 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2f940 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20     Pgno child = 
2f950 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20  get4byte(z);.   
2f960 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
2f970 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26  Bt, child, &e, &
2f980 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
2f990 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
2f9a0 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
2f9b0 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d  BTREE );.      }
2f9c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
2f9d0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2f9e0 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20       Pgno child 
2f9f0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2fa00 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2fa10 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2fa20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
2fa30 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26  Bt, child, &e, &
2fa40 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
2fa50 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
2fa60 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54   && e==PTRMAP_BT
2fa70 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  REE );.    }.  }
2fa80 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
2fa90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
2faa0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
2fab0 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63  ed to copy the c
2fac0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
2fad0 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65  -tree node store
2fae0 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46  d .** on page pF
2faf0 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e  rom to page pTo.
2fb00 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77   If page pFrom w
2fb10 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61  as not a leaf pa
2fb20 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ge, then.** the 
2fb30 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
2fb40 69 65 73 20 66 6f 72 20 65 61 63 68 20 63 68 69  ies for each chi
2fb50 6c 64 20 70 61 67 65 20 61 72 65 20 75 70 64 61  ld page are upda
2fb60 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a  ted so that the.
2fb70 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20 73  ** parent page s
2fb80 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69  tored in the poi
2fb90 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61 67 65  nter map is page
2fba0 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63   pTo. If pFrom c
2fbb0 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20  ontained.** any 
2fbc0 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66  cells with overf
2fbd0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
2fbe0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72  s, then the corr
2fbf0 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65  esponding pointe
2fc00 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
2fc10 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65   are also update
2fc20 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  d so that the pa
2fc30 72 65 6e 74 20 70 61 67 65 20 69 73 20 70 61 67  rent page is pag
2fc40 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  e pTo..**.** If 
2fc50 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74  pFrom is current
2fc60 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20  ly carrying any 
2fc70 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28  overflow cells (
2fc80 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a  entries in the.*
2fc90 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b  * MemPage.aOvfl[
2fca0 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61  ] array), they a
2fcb0 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f  re not copied to
2fcc0 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66   pTo. .**.** Bef
2fcd0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70  ore returning, p
2fce0 61 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69  age pTo is reini
2fcf0 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62  tialized using b
2fd00 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
2fd10 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72  **.** The perfor
2fd20 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75  mance of this fu
2fd30 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72  nction is not cr
2fd40 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e  itical. It is on
2fd50 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74  ly used by .** t
2fd60 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c  he balance_shall
2fd70 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e  ower() and balan
2fd80 63 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63  ce_deeper() proc
2fd90 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20  edures, neither 
2fda0 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20  of.** which are 
2fdb0 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64  called often und
2fdc0 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d  er normal circum
2fdd0 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74  stances..*/.stat
2fde0 69 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65  ic void copyNode
2fdf0 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20  Content(MemPage 
2fe00 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20  *pFrom, MemPage 
2fe10 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b  *pTo, int *pRC){
2fe20 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53  .  if( (*pRC)==S
2fe30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fe40 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74  BtShared * const
2fe50 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42   pBt = pFrom->pB
2fe60 74 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73  t;.    u8 * cons
2fe70 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d  t aFrom = pFrom-
2fe80 3e 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a  >aData;.    u8 *
2fe90 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f   const aTo = pTo
2fea0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74  ->aData;.    int
2feb0 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20   const iFromHdr 
2fec0 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73  = pFrom->hdrOffs
2fed0 65 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73  et;.    int cons
2fee0 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f  t iToHdr = ((pTo
2fef0 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30  ->pgno==1) ? 100
2ff00 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72   : 0);.    int r
2ff10 63 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61  c;.    int iData
2ff20 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65  ;.  .  .    asse
2ff30 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69  rt( pFrom->isIni
2ff40 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
2ff50 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69   pFrom->nFree>=i
2ff60 54 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73  ToHdr );.    ass
2ff70 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26 61  ert( get2byte(&a
2ff80 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d  From[iFromHdr+5]
2ff90 29 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75  ) <= (int)pBt->u
2ffa0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a  sableSize );.  .
2ffb0 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
2ffc0 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74  b-tree node cont
2ffd0 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46  ent from page pF
2ffe0 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e  rom to page pTo.
2fff0 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20   */.    iData = 
30000 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b  get2byte(&aFrom[
30010 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20  iFromHdr+5]);.  
30020 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44    memcpy(&aTo[iD
30030 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61  ata], &aFrom[iDa
30040 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  ta], pBt->usable
30050 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20  Size-iData);.   
30060 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f   memcpy(&aTo[iTo
30070 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72  Hdr], &aFrom[iFr
30080 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63  omHdr], pFrom->c
30090 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46  ellOffset + 2*pF
300a0 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a  rom->nCell);.  .
300b0 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c      /* Reinitial
300c0 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20  ize page pTo so 
300d0 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
300e0 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
300f0 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a   structure.    *
30100 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  * match the new 
30110 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61  data. The initia
30120 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20  lization of pTo 
30130 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69  can actually fai
30140 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66  l under.    ** f
30150 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69  airly obscure ci
30160 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65  rcumstances, eve
30170 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 61  n though it is a
30180 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c   copy of initial
30190 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67  ized .    ** pag
301a0 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a  e pFrom..    */.
301b0 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20      pTo->isInit 
301c0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  = 0;.    rc = bt
301d0 72 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29  reeInitPage(pTo)
301e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
301f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30200 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
30210 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
30220 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
30230 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
30240 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
30250 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
30260 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20  -map entries.   
30270 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72   ** for any b-tr
30280 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  ee or overflow p
30290 61 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f  ages that pTo no
302a0 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  w contains the p
302b0 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20  ointers to..    
302c0 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
302d0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
302e0 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64   *pRC = setChild
302f0 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20  Ptrmaps(pTo);.  
30300 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
30310 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
30320 64 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c  distributes cell
30330 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74  s on the iParent
30340 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20  Idx'th child of 
30350 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65  pParent.** (here
30360 61 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22  after "the page"
30370 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69  ) and up to 2 si
30380 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61  blings so that a
30390 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62  ll pages have ab
303a0 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  out the.** same 
303b0 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73  amount of free s
303c0 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20  pace. Usually a 
303d0 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f  single sibling o
303e0 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
303f0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65   the.** page are
30400 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c   used in the bal
30410 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62  ancing, though b
30420 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67  oth siblings mig
30430 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65  ht come from one
30440 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20  .** side if the 
30450 70 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73  page is the firs
30460 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20  t or last child 
30470 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49  of its parent. I
30480 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68  f the page .** h
30490 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20  as fewer than 2 
304a0 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68  siblings (someth
304b0 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e  ing which can on
304c0 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
304d0 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f   page.** is a ro
304e0 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69  ot page or a chi
304f0 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67  ld of a root pag
30500 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69  e) then all avai
30510 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a  lable siblings.*
30520 2a 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  * participate in
30530 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a   the balancing..
30540 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
30550 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20   of siblings of 
30560 74 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62  the page might b
30570 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64  e increased or d
30580 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20  ecreased by .** 
30590 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e  one or two in an
305a0 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20   effort to keep 
305b0 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c  pages nearly ful
305c0 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66  l but not over f
305d0 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ull. .**.** Note
305e0 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20   that when this 
305f0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
30600 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63  d, some of the c
30610 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
30620 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63  .** might not ac
30630 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64  tually be stored
30640 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74   in MemPage.aDat
30650 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61  a[]. This can ha
30660 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70  ppen.** if the p
30670 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e  age is overfull.
30680 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
30690 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63  sures that all c
306a0 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  ells allocated.*
306b0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e  * to the page an
306c0 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66  d its siblings f
306d0 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e  it into MemPage.
306e0 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72  aData[] before r
306f0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
30700 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66  In the course of
30710 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70   balancing the p
30720 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c  age and its sibl
30730 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20  ings, cells may 
30740 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69  be.** inserted i
30750 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66  nto or removed f
30760 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
30770 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44  age (pParent). D
30780 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63  oing so.** may c
30790 61 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 20  ause the parent 
307a0 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f  page to become o
307b0 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72  verfull or under
307c0 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a  full. If this.**
307d0 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20   happens, it is 
307e0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
307f0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
30800 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63   to invoke the c
30810 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63  orrect.** balanc
30820 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66  ing routine to f
30830 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  ix this problem 
30840 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65  (see the balance
30850 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a  () routine). .**
30860 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
30870 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  ine fails for an
30880 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67  y reason, it mig
30890 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74  ht leave the dat
308a0 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f  abase.** in a co
308b0 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 53  rrupted state. S
308c0 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
308d0 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74  e fails, the dat
308e0 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  abase should.** 
308f0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
30900 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20  **.** The third 
30910 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
30920 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c   function, aOvfl
30930 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e  Space, is a poin
30940 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66  ter to a.** buff
30950 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  er big enough to
30960 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20   hold one page. 
30970 49 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69  If while inserti
30980 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68  ng cells into th
30990 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65  e parent.** page
309a0 20 28 70 50 61 72 65 6e 74 29 20 74 68 65 20 70   (pParent) the p
309b0 61 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d  arent page becom
309c0 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69  es overfull, thi
309d0 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75  s buffer is.** u
309e0 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
309f0 20 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c   parent's overfl
30a00 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73  ow cells. Becaus
30a10 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
30a20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78  inserts.** a max
30a30 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76  imum of four div
30a40 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ider cells into 
30a50 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c  the parent page,
30a60 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d   and the maximum
30a70 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65  .** size of a ce
30a80 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  ll stored within
30a90 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64   an internal nod
30aa0 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73  e is always less
30ab0 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20   than 1/4.** of 
30ac0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74  the page-size, t
30ad0 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20  he aOvflSpace[] 
30ae0 62 75 66 66 65 72 20 69 73 20 67 75 61 72 61 6e  buffer is guaran
30af0 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65  teed to be large
30b00 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61  .** enough for a
30b10 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ll overflow cell
30b20 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66  s..**.** If aOvf
30b30 6c 53 70 61 63 65 20 69 73 20 73 65 74 20 74 6f  lSpace is set to
30b40 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c   a null pointer,
30b50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
30b60 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
30b70 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74  E_NOMEM..*/.stat
30b80 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e  ic int balance_n
30b90 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67  onroot(.  MemPag
30ba0 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20  e *pParent,     
30bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
30bc0 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c  ent page of sibl
30bd0 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e  ings being balan
30be0 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ced */.  int iPa
30bf0 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20  rentIdx,        
30c00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
30c10 78 20 6f 66 20 22 74 68 65 20 70 61 67 65 22 20  x of "the page" 
30c20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
30c30 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20  u8 *aOvflSpace, 
30c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c50 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74  /* page-size byt
30c60 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
30c70 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20  parent ovfl */. 
30c80 20 69 6e 74 20 69 73 52 6f 6f 74 20 20 20 20 20   int isRoot     
30c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ca0 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72   /* True if pPar
30cb0 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61  ent is a root-pa
30cc0 67 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  ge */.){.  BtSha
30cd0 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
30ce0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77          /* The w
30cf0 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  hole database */
30d00 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30  .  int nCell = 0
30d10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30d20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
30d30 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
30d40 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c  /.  int nMaxCell
30d50 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
30d60 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
30d70 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a  ze of apCell, sz
30d80 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a  Cell, aFrom. */.
30d90 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20    int nNew = 0; 
30da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30db0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
30dc0 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a  s in apNew[] */.
30dd0 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20    int nOld;     
30de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30df0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
30e00 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  s in apOld[] */.
30e10 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20    int i, j, k;  
30e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30e30 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
30e40 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20  */.  int nxDiv; 
30e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e60 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65    /* Next divide
30e70 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e  r slot in pParen
30e80 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  t->aCell[] */.  
30e90 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
30ea0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
30eb0 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
30ec0 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72  */.  u16 leafCor
30ed0 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  rection;        
30ee0 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20    /* 4 if pPage 
30ef0 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
30f00 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65   not */.  int le
30f10 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  afData;         
30f20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
30f30 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
30f40 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20  f of a LEAFDATA 
30f50 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  tree */.  int us
30f60 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20  ableSpace;      
30f70 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
30f80 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20  in pPage beyond 
30f90 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
30fa0 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20  int pageFlags;  
30fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30fc0 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e  Value of pPage->
30fd0 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e  aData[0] */.  in
30fe0 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20  t subtotal;     
30ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
31000 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20  btotal of bytes 
31010 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20  in cells on one 
31020 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53  page */.  int iS
31030 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20  pace1 = 0;      
31040 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
31050 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61  unused byte of a
31060 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e  Space1[] */.  in
31070 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30  t iOvflSpace = 0
31080 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
31090 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
310a0 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20  of aOvflSpace[] 
310b0 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74  */.  int szScrat
310c0 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ch;             
310d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72    /* Size of scr
310e0 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75  atch memory requ
310f0 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61  ested */.  MemPa
31100 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20  ge *apOld[NB];  
31110 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
31120 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73   and up to two s
31130 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d  iblings */.  Mem
31140 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d  Page *apCopy[NB]
31150 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69  ;         /* Pri
31160 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61  vate copies of a
31170 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a  pOld[] pages */.
31180 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77    MemPage *apNew
31190 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f  [NB+2];        /
311a0 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
311b0 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66  o NB siblings af
311c0 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f  ter balancing */
311d0 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20  .  u8 *pRight;  
311e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311f0 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70  /* Location in p
31200 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73  arent of right-s
31210 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a  ibling pointer *
31220 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42  /.  u8 *apDiv[NB
31230 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  -1];            
31240 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c   /* Divider cell
31250 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  s in pParent */.
31260 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b    int cntNew[NB+
31270 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  2];            /
31280 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c  * Index in aCell
31290 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72  [] of cell after
312a0 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
312b0 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b  int szNew[NB+2];
312c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
312d0 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66  Combined size of
312e0 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20   cells place on 
312f0 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  i-th page */.  u
31300 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20  8 **apCell = 0; 
31310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
31320 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62  ll cells begin b
31330 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36  alanced */.  u16
31340 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
31350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
31360 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
31370 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
31380 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65   */.  u8 *aSpace
31390 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
313a0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
313b0 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65  copies of divide
313c0 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67  rs cells */.  Pg
313d0 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
313e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
313f0 6d 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20  mp var to store 
31400 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  a page number in
31410 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61   */..  pBt = pPa
31420 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73  rent->pBt;.  ass
31430 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
31440 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
31450 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
31460 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
31470 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
31480 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23  ->pDbPage) );..#
31490 69 66 20 30 0a 20 20 54 52 41 43 45 28 28 22 42  if 0.  TRACE(("B
314a0 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61  ALANCE: begin pa
314b0 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25  ge %d child of %
314c0 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
314d0 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  o, pParent->pgno
314e0 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ));.#endif..  /*
314f0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70   At this point p
31500 50 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20  Parent may have 
31510 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72  at most one over
31520 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69  flow cell. And i
31530 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72  f.  ** this over
31540 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65  flow cell is pre
31550 73 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65  sent, it must be
31560 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a   the cell with .
31570 20 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65    ** index iPare
31580 6e 74 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e  ntIdx. This scen
31590 61 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74  ario comes about
315a0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
315b0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c  ion.  ** is call
315c0 65 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20  ed (indirectly) 
315d0 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65  from sqlite3Btre
315e0 65 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a  eDelete()..  */.
315f0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
31600 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  t->nOverflow==0 
31610 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  || pParent->nOve
31620 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73  rflow==1 );.  as
31630 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e  sert( pParent->n
31640 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70  Overflow==0 || p
31650 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d  Parent->aOvfl[0]
31660 2e 69 64 78 3d 3d 69 50 61 72 65 6e 74 49 64 78  .idx==iParentIdx
31670 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66   );..  if( !aOvf
31680 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65  lSpace ){.    re
31690 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
316a0 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  M;.  }..  /* Fin
316b0 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  d the sibling pa
316c0 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20  ges to balance. 
316d0 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  Also locate the 
316e0 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
316f0 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69   .  ** that divi
31700 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e  de the siblings.
31710 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
31720 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73  ade to find NN s
31730 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a  iblings on .  **
31740 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
31750 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c  pPage. More sibl
31760 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66  ings are taken f
31770 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f  rom one side, ho
31780 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20  wever, .  ** if 
31790 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20  there are fewer 
317a0 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73  than NN siblings
317b0 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69   on the other si
317c0 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20  de. If pParent. 
317d0 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65   ** has NB or fe
317e0 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65  wer children the
317f0 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  n all children o
31800 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61  f pParent are ta
31810 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ken.  .  **.  **
31820 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
31830 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64 65  drops the divide
31840 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65  r cells from the
31850 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68   parent page. Th
31860 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65  is.  ** way, the
31870 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
31880 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
31890 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c  not have to deal
318a0 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f   with any.  ** o
318b0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e  verflow cells in
318c0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
318d0 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65  , since if any e
318e0 78 69 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c  xisted they will
318f0 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61  .  ** have alrea
31900 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e  dy been removed.
31910 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72  .  */.  i = pPar
31920 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b  ent->nOverflow +
31930 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b   pParent->nCell;
31940 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20  .  if( i<2 ){.  
31950 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20    nxDiv = 0;.   
31960 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 7d   nOld = i+1;.  }
31970 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c 64 20 3d  else{.    nOld =
31980 20 33 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72   3;.    if( iPar
31990 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20 20  entIdx==0 ){    
319a0 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
319b0 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20      nxDiv = 0;. 
319c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50 61     }else if( iPa
319d0 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20  rentIdx==i ){.  
319e0 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32 3b      nxDiv = i-2;
319f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
31a00 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65 6e    nxDiv = iParen
31a10 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  tIdx-1;.    }.  
31a20 20 20 69 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 69    i = 2;.  }.  i
31a30 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72  f( (i+nxDiv-pPar
31a40 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d  ent->nOverflow)=
31a50 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
31a60 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  ){.    pRight = 
31a70 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
31a80 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
31a90 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  et+8];.  }else{.
31aa0 20 20 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e      pRight = fin
31ab0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
31ac0 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
31ad0 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a  nOverflow);.  }.
31ae0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
31af0 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69  e(pRight);.  whi
31b00 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20  le( 1 ){.    rc 
31b10 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
31b20 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f  (pBt, pgno, &apO
31b30 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ld[i]);.    if( 
31b40 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  rc ){.      mems
31b50 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b  et(apOld, 0, (i+
31b60 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  1)*sizeof(MemPag
31b70 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  e*));.      goto
31b80 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
31b90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78  ;.    }.    nMax
31ba0 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64  Cells += 1+apOld
31bb0 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64  [i]->nCell+apOld
31bc0 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  [i]->nOverflow;.
31bd0 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30      if( (i--)==0
31be0 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69   ) break;..    i
31bf0 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72  f( i+nxDiv==pPar
31c00 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  ent->aOvfl[0].id
31c10 78 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  x && pParent->nO
31c20 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
31c30 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72   apDiv[i] = pPar
31c40 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43  ent->aOvfl[0].pC
31c50 65 6c 6c 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20  ell;.      pgno 
31c60 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
31c70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  [i]);.      szNe
31c80 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  w[i] = cellSizeP
31c90 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
31ca0 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50 61  v[i]);.      pPa
31cb0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
31cc0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
31cd0 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
31ce0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e   findCell(pParen
31cf0 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
31d00 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a  nt->nOverflow);.
31d10 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
31d20 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
31d30 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20  .      szNew[i] 
31d40 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
31d50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29  arent, apDiv[i])
31d60 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f 70  ;..      /* Drop
31d70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74   the cell from t
31d80 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
31d90 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70  apDiv[i] still p
31da0 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a  oints to.      *
31db0 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69  * the cell withi
31dc0 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65 76  n the parent, ev
31dd0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61 73  en though it has
31de0 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20   been dropped.. 
31df0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
31e00 73 61 66 65 20 62 65 63 61 75 73 65 20 64 72 6f  safe because dro
31e10 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c  pping a cell onl
31e20 79 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65  y overwrites the
31e30 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20   first.      ** 
31e40 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 74  four bytes of it
31e50 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  , and this funct
31e60 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
31e70 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  d the first.    
31e80 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20    ** four bytes 
31e90 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
31ea0 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e  ell. So the poin
31eb0 74 65 72 20 69 73 20 73 61 66 65 20 74 6f 20 75  ter is safe to u
31ec0 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65  se.      ** late
31ed0 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a  r on.  .      **
31ee0 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f  .      ** But no
31ef0 74 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 73  t if we are in s
31f00 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
31f10 65 2e 20 49 6e 20 73 65 63 75 72 65 2d 64 65 6c  e. In secure-del
31f20 65 74 65 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20  ete mode,.      
31f30 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28  ** the dropCell(
31f40 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  ) routine will o
31f50 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e 74  verwrite the ent
31f60 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65  ire cell with ze
31f70 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  roes..      ** I
31f80 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d  n this case, tem
31f90 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68  porarily copy th
31fa0 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  e cell into the 
31fb0 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20  aOvflSpace[].   
31fc0 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74     ** buffer. It
31fd0 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20   will be copied 
31fe0 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f  out again as soo
31ff0 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65 5b  n as the aSpace[
32000 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a  ] buffer.      *
32010 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20  * is allocated. 
32020 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
32030 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
32040 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
32050 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 69 4f  Off;..        iO
32060 66 66 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  ff = SQLITE_PTR_
32070 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d 29  TO_INT(apDiv[i])
32080 20 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   - SQLITE_PTR_TO
32090 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61 44  _INT(pParent->aD
320a0 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ata);.        if
320b0 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d  ( (iOff+szNew[i]
320c0 29 3e 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  )>(int)pBt->usab
320d0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
320e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
320f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
32100 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61          memset(a
32110 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73  pOld, 0, (i+1)*s
32120 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29  izeof(MemPage*))
32130 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
32140 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
32150 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
32160 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
32170 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f  y(&aOvflSpace[iO
32180 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73  ff], apDiv[i], s
32190 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zNew[i]);.      
321a0 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26      apDiv[i] = &
321b0 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76  aOvflSpace[apDiv
321c0 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61  [i]-pParent->aDa
321d0 74 61 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ta];.        }. 
321e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 72 6f       }.      dro
321f0 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  pCell(pParent, i
32200 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
32210 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77  nOverflow, szNew
32220 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  [i], &rc);.    }
32230 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
32240 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74  nMaxCells a mult
32250 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64  iple of 4 in ord
32260 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38  er to preserve 8
32270 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e  -byte.  ** align
32280 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65  ment */.  nMaxCe
32290 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73  lls = (nMaxCells
322a0 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a   + 3)&~3;..  /*.
322b0 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    ** Allocate sp
322c0 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73  ace for memory s
322d0 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20  tructures.  */. 
322e0 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69   k = pBt->pageSi
322f0 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65  ze + ROUND8(size
32300 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
32310 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20  szScratch =.    
32320 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a     nMaxCells*siz
32330 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20  eof(u8*)        
32340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32350 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * apCell */.    
32360 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a   + nMaxCells*siz
32370 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20  eof(u16)        
32380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32390 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * szCell */.    
323a0 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
323b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
323d0 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20  * aSpace1 */.   
323e0 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20    + k*nOld;     
323f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32410 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20 28  /* Page copies (
32420 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43  apCopy) */.  apC
32430 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72  ell = sqlite3Scr
32440 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63  atchMalloc( szSc
32450 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20  ratch ); .  if( 
32460 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  apCell==0 ){.   
32470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
32480 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
32490 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
324a0 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31  }.  szCell = (u1
324b0 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43  6*)&apCell[nMaxC
324c0 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31  ells];.  aSpace1
324d0 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b   = (u8*)&szCell[
324e0 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73  nMaxCells];.  as
324f0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
32500 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63  _ALIGNMENT(aSpac
32510 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  e1) );..  /*.  *
32520 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20  * Load pointers 
32530 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  to all cells on 
32540 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e  sibling pages an
32550 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  d the divider ce
32560 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  lls.  ** into th
32570 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d  e local apCell[]
32580 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f   array.  Make co
32590 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  pies of the divi
325a0 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
325b0 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
325c0 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b  ed from aSpace1[
325d0 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65  ] and remove the
325e0 20 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c   the divider Cel
325f0 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61  ls.  ** from pPa
32600 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rent..  **.  ** 
32610 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
32620 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65  are on leaf page
32630 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
32640 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68  d pointers of th
32650 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63  e.  ** divider c
32660 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65  ells are strippe
32670 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73  d from the cells
32680 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65   before they are
32690 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74   copied.  ** int
326a0 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e  o aSpace1[].  In
326b0 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63   this way, all c
326c0 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
326d0 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a   are without.  *
326e0 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  * child pointers
326f0 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61  .  If siblings a
32700 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
32710 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a  hen all cell in.
32720 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e    ** apCell[] in
32730 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e  clude child poin
32740 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61  ters.  Either wa
32750 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
32760 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72  apCell[].  ** ar
32770 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20  e alike..  **.  
32780 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  ** leafCorrectio
32790 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69  n:  4 if pPage i
327a0 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
327b0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c  pPage is not a l
327c0 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20  eaf..  **       
327d0 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20  leafData:  1 if 
327e0 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b  pPage holds key+
327f0 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74  data and pParent
32800 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73   holds only keys
32810 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72  ..  */.  leafCor
32820 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b  rection = apOld[
32830 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65  0]->leaf*4;.  le
32840 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30  afData = apOld[0
32850 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f  ]->hasData;.  fo
32860 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
32870 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  ++){.    int lim
32880 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20  it;.    .    /* 
32890 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
328a0 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65  thing else, take
328b0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
328c0 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62  'th original sib
328d0 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20  ling.    ** The 
328e0 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e  rest of this fun
328f0 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64  ction will use d
32900 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70  ata from the cop
32910 69 65 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a  ies rather.    *
32920 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  * that the origi
32930 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20  nal pages since 
32940 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
32950 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68  es will be in th
32960 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  e.    ** process
32970 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72   of being overwr
32980 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d  itten.  */.    M
32990 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61  emPage *pOld = a
329a0 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50  pCopy[i] = (MemP
329b0 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42  age*)&aSpace1[pB
329c0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a  t->pageSize + k*
329d0 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i];.    memcpy(p
329e0 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73  Old, apOld[i], s
329f0 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b  izeof(MemPage));
32a00 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61  .    pOld->aData
32a10 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b   = (void*)&pOld[
32a20 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
32a30 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c  Old->aData, apOl
32a40 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74  d[i]->aData, pBt
32a50 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
32a60 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e    limit = pOld->
32a70 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65  nCell+pOld->nOve
32a80 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 70  rflow;.    if( p
32a90 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  Old->nOverflow>0
32aa0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   ){.      for(j=
32ab0 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
32ac0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
32ad0 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
32ae0 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43  s );.        apC
32af0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e  ell[nCell] = fin
32b00 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f  dOverflowCell(pO
32b10 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20  ld, j);.        
32b20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
32b30 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64  cellSizePtr(pOld
32b40 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29  , apCell[nCell])
32b50 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b  ;.        nCell+
32b60 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
32b70 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a  else{.      u8 *
32b80 61 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e 61 44  aData = pOld->aD
32b90 61 74 61 3b 0a 20 20 20 20 20 20 75 31 36 20 6d  ata;.      u16 m
32ba0 61 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64 2d 3e  askPage = pOld->
32bb0 6d 61 73 6b 50 61 67 65 3b 0a 20 20 20 20 20 20  maskPage;.      
32bc0 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  u16 cellOffset =
32bd0 20 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66 73 65   pOld->cellOffse
32be0 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  t;.      for(j=0
32bf0 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
32c00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
32c10 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
32c20 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65   );.        apCe
32c30 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64  ll[nCell] = find
32c40 43 65 6c 6c 76 32 28 61 44 61 74 61 2c 20 6d 61  Cellv2(aData, ma
32c50 73 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66 66 73  skPage, cellOffs
32c60 65 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20  et, j);.        
32c70 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
32c80 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64  cellSizePtr(pOld
32c90 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29  , apCell[nCell])
32ca0 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b  ;.        nCell+
32cb0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
32cc0 20 20 20 20 20 20 20 0a 20 20 20 20 69 66 28 20         .    if( 
32cd0 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61  i<nOld-1 && !lea
32ce0 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75 31  fData){.      u1
32cf0 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65  6 sz = (u16)szNe
32d00 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a  w[i];.      u8 *
32d10 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73 73  pTemp;.      ass
32d20 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
32d30 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73 7a  ells );.      sz
32d40 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a  Cell[nCell] = sz
32d50 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20  ;.      pTemp = 
32d60 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65 31  &aSpace1[iSpace1
32d70 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65 31  ];.      iSpace1
32d80 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73   += sz;.      as
32d90 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d  sert( sz<=pBt->m
32da0 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20  axLocal+23 );.  
32db0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
32dc0 63 65 31 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  ce1 <= (int)pBt-
32dd0 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
32de0 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c     memcpy(pTemp,
32df0 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a   apDiv[i], sz);.
32e00 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
32e10 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
32e20 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
32e30 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
32e40 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c  rrection==0 || l
32e50 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
32e60 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c   );.      szCell
32e70 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c  [nCell] = szCell
32e80 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f  [nCell] - leafCo
32e90 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
32ea0 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20  if( !pOld->leaf 
32eb0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
32ec0 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
32ed0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
32ee0 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64  assert( pOld->hd
32ef0 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20  rOffset==0 );.  
32f00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
32f10 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht pointer of th
32f20 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c  e child page pOl
32f30 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65  d becomes the le
32f40 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  ft.        ** po
32f50 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76  inter of the div
32f60 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20  ider cell */.   
32f70 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65       memcpy(apCe
32f80 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64  ll[nCell], &pOld
32f90 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a  ->aData[8], 4);.
32fa0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32fb0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
32fc0 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
32fd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  ;.        if( sz
32fe0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b  Cell[nCell]<4 ){
32ff0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  .          /* Do
33000 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63   not allow any c
33010 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  ells smaller tha
33020 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  n 4 bytes. */.  
33030 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
33040 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20  Cell] = 4;.     
33050 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33060 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
33070 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
33080 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
33090 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
330a0 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61  needed to hold a
330b0 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a  ll nCell cells..
330c0 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20    ** Store this 
330d0 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20  number in "k".  
330e0 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e  Also compute szN
330f0 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
33100 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a  e total.  ** siz
33110 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  e of all cells o
33120 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20  n the i-th page 
33130 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69  and cntNew[] whi
33140 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a  ch is the index.
33150 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d    ** in apCell[]
33160 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61   of the cell tha
33170 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69  t divides page i
33180 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20   from page i+1. 
33190 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d   .  ** cntNew[k]
331a0 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43   should equal nC
331b0 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ell..  **.  ** V
331c0 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62  alues computed b
331d0 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20  y this block:.  
331e0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
331f0 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e    k: The total n
33200 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
33210 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73   pages.  **    s
33220 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20  zNew[i]: Spaced 
33230 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68  used on the i-th
33240 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
33250 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a   **   cntNew[i]:
33260 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c   Index in apCell
33270 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20  [] and szCell[] 
33280 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65  for the first ce
33290 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20  ll to.  **      
332a0 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
332b0 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69  t of the i-th si
332c0 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
332d0 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75   usableSpace: Nu
332e0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
332f0 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
33300 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67   on each sibling
33310 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75  ..  ** .  */.  u
33320 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74  sableSpace = pBt
33330 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31  ->usableSize - 1
33340 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  2 + leafCorrecti
33350 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74  on;.  for(subtot
33360 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c  al=k=i=0; i<nCel
33370 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  l; i++){.    ass
33380 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73  ert( i<nMaxCells
33390 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c   );.    subtotal
333a0 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20   += szCell[i] + 
333b0 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f  2;.    if( subto
333c0 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63  tal > usableSpac
333d0 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77  e ){.      szNew
333e0 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d  [k] = subtotal -
333f0 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
33400 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b    cntNew[k] = i;
33410 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
33420 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  ata ){ i--; }.  
33430 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30      subtotal = 0
33440 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20  ;.      k++;.   
33450 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b     if( k>NB+1 ){
33460 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
33470 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f 20  RUPT_BKPT; goto 
33480 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
33490 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
334a0 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
334b0 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20  al;.  cntNew[k] 
334c0 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a  = nCell;.  k++;.
334d0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70  .  /*.  ** The p
334e0 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20  acking computed 
334f0 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
33500 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20  block is biased 
33510 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69  toward the sibli
33520 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ngs.  ** on the 
33530 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20  left side.  The 
33540 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72  left siblings ar
33550 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20  e always nearly 
33560 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a  full, while the.
33570 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20    ** right-most 
33580 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65  sibling might be
33590 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20   nearly empty.  
335a0 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  This block of co
335b0 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a  de attempts.  **
335c0 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70   to adjust the p
335d0 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e  acking of siblin
335e0 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74  gs to get a bett
335f0 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a  er balance..  **
33600 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73  .  ** This adjus
33610 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68  tment is more th
33620 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  an an optimizati
33630 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67  on.  The packing
33640 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a   above might.  *
33650 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62  * be so out of b
33660 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20  alance as to be 
33670 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78  illegal.  For ex
33680 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74  ample, the right
33690 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69  -most.  ** sibli
336a0 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70  ng might be comp
336b0 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54  letely empty.  T
336c0 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
336d0 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a  s not optional..
336e0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31    */.  for(i=k-1
336f0 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
33700 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73   int szRight = s
33710 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a  zNew[i];  /* Siz
33720 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
33730 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20  the right */.   
33740 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a   int szLeft = sz
33750 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a  New[i-1]; /* Siz
33760 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
33770 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20  the left */.    
33780 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20  int r;          
33790 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
337a0 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
337b0 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20  in left sibling 
337c0 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20  */.    int d;   
337d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
337e0 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c  dex of first cel
337f0 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  l to the left of
33800 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a   right sibling *
33810 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  /..    r = cntNe
33820 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
33830 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
33840 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
33850 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( d<nMaxCells );
33860 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e  .    assert( r<n
33870 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
33880 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d  while( szRight==
33890 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43  0 || szRight+szC
338a0 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74  ell[d]+2<=szLeft
338b0 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29  -(szCell[r]+2) )
338c0 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20  {.      szRight 
338d0 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32  += szCell[d] + 2
338e0 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d  ;.      szLeft -
338f0 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b  = szCell[r] + 2;
33900 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d  .      cntNew[i-
33910 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20  1]--;.      r = 
33920 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b  cntNew[i-1] - 1;
33930 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31  .      d = r + 1
33940 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
33950 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20   }.    szNew[i] 
33960 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73  = szRight;.    s
33970 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65  zNew[i-1] = szLe
33980 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69  ft;.  }..  /* Ei
33990 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e  ther we found on
339a0 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20  e or more cells 
339b0 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f  (cntnew[0])>0) o
339c0 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20  r pPage is.  ** 
339d0 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
339e0 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20  age.  A virtual 
339f0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65  root page is whe
33a00 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a  n the real root.
33a10 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67    ** page is pag
33a20 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74  e 1 and we are t
33a30 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66  he only child of
33a40 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f   that page..  */
33a50 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65  .  assert( cntNe
33a60 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65  w[0]>0 || (pPare
33a70 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70  nt->pgno==1 && p
33a80 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30  Parent->nCell==0
33a90 29 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22  ) );..  TRACE(("
33aa0 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64  BALANCE: old: %d
33ab0 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61   %d %d  ",.    a
33ac0 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a  pOld[0]->pgno, .
33ad0 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70      nOld>=2 ? ap
33ae0 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30  Old[1]->pgno : 0
33af0 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20  ,.    nOld>=3 ? 
33b00 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a  apOld[2]->pgno :
33b10 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20   0.  ));..  /*. 
33b20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e   ** Allocate k n
33b30 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65  ew pages.  Reuse
33b40 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65   old pages where
33b50 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a   possible..  */.
33b60 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e    if( apOld[0]->
33b70 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72  pgno<=1 ){.    r
33b80 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
33b90 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
33ba0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
33bb0 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61  p;.  }.  pageFla
33bc0 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61  gs = apOld[0]->a
33bd0 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69  Data[0];.  for(i
33be0 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
33bf0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
33c00 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  ;.    if( i<nOld
33c10 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
33c20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c   apNew[i] = apOl
33c30 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c  d[i];.      apOl
33c40 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  d[i] = 0;.      
33c50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33c60 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62  rWrite(pNew->pDb
33c70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65  Page);.      nNe
33c80 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72  w++;.      if( r
33c90 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
33ca0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65  _cleanup;.    }e
33cb0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
33cc0 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  t( i>0 );.      
33cd0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
33ce0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
33cf0 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20  w, &pgno, pgno, 
33d00 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
33d10 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
33d20 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
33d30 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a  pNew[i] = pNew;.
33d40 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20        nNew++;.. 
33d50 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
33d60 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
33d70 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69  y for the new si
33d80 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
33d90 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56       if( ISAUTOV
33da0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20  ACUUM ){.       
33db0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
33dc0 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  pNew->pgno, PTRM
33dd0 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
33de0 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  t->pgno, &rc);. 
33df0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
33e00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33e10 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
33e20 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
33e30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
33e40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72    }.  }..  /* Fr
33e50 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73  ee any old pages
33e60 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72   that were not r
33e70 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67  eused as new pag
33e80 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  es..  */.  while
33e90 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
33ea0 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  freePage(apOld[i
33eb0 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  ], &rc);.    if(
33ec0 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
33ed0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
33ee0 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
33ef0 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64  d[i]);.    apOld
33f00 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b  [i] = 0;.    i++
33f10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
33f20 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67   Put the new pag
33f30 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  es in accending 
33f40 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c  order.  This hel
33f50 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20  ps to.  ** keep 
33f60 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64  entries in the d
33f70 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  isk file in orde
33f80 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e  r so that a scan
33f90 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  .  ** of the tab
33fa0 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73  le is a linear s
33fb0 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
33fc0 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a  file.  That.  **
33fd0 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74   in turn helps t
33fe0 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
33ff0 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70  tem to deliver p
34000 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74  ages.  ** from t
34010 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70  he disk more rap
34020 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  idly..  **.  ** 
34030 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74  An O(n^2) insert
34040 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74  ion sort algorit
34050 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20  hm is used, but 
34060 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20  since.  ** n is 
34070 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
34080 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73  NB (a small cons
34090 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75  tant), that shou
340a0 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61  ld.  ** not be a
340b0 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20   problem..  **. 
340c0 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20   ** When NB==3, 
340d0 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a  this one optimiz
340e0 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20  ation makes the 
340f0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62  database.  ** ab
34100 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66  out 25% faster f
34110 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69  or large inserti
34120 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ons and deletion
34130 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
34140 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a  0; i<k-1; i++){.
34150 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61      int minV = a
34160 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20  pNew[i]->pgno;. 
34170 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b     int minI = i;
34180 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20  .    for(j=i+1; 
34190 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<k; j++){.     
341a0 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70   if( apNew[j]->p
341b0 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69  gno<(unsigned)mi
341c0 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69  nV ){.        mi
341d0 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  nI = j;.        
341e0 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d  minV = apNew[j]-
341f0 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  >pgno;.      }. 
34200 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e     }.    if( min
34210 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  I>i ){.      Mem
34220 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
34230 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  pT = apNew[i];. 
34240 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
34250 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  apNew[minI];.   
34260 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d     apNew[minI] =
34270 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   pT;.    }.  }. 
34280 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25 64   TRACE(("new: %d
34290 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
342a0 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
342b0 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30  \n",.    apNew[0
342c0 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30  ]->pgno, szNew[0
342d0 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f  ],.    nNew>=2 ?
342e0 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20   apNew[1]->pgno 
342f0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73  : 0, nNew>=2 ? s
34300 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  zNew[1] : 0,.   
34310 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77   nNew>=3 ? apNew
34320 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [2]->pgno : 0, n
34330 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32  New>=3 ? szNew[2
34340 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
34350 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70  =4 ? apNew[3]->p
34360 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34  gno : 0, nNew>=4
34370 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c   ? szNew[3] : 0,
34380 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61  .    nNew>=5 ? a
34390 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[4]->pgno : 
343a0 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e  0, nNew>=5 ? szN
343b0 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20  ew[4] : 0));..  
343c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
343d0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
343e0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
343f0 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  ) );.  put4byte(
34400 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e  pRight, apNew[nN
34410 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  ew-1]->pgno);.. 
34420 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20   /*.  ** Evenly 
34430 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64  distribute the d
34440 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  ata in apCell[] 
34450 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70  across the new p
34460 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72  ages..  ** Inser
34470 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  t divider cells 
34480 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20  into pParent as 
34490 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
344a0 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    j = 0;.  for(i
344b0 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
344c0 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c  {.    /* Assembl
344d0 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  e the new siblin
344e0 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d  g page. */.    M
344f0 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
34500 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73  pNew[i];.    ass
34510 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
34520 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
34530 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73  (pNew, pageFlags
34540 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50  );.    assembleP
34550 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77  age(pNew, cntNew
34560 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a  [i]-j, &apCell[j
34570 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a  ], &szCell[j]);.
34580 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
34590 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e  ->nCell>0 || (nN
345a0 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b  ew==1 && cntNew[
345b0 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  0]==0) );.    as
345c0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65  sert( pNew->nOve
345d0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20  rflow==0 );..   
345e0 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a   j = cntNew[i];.
345f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
34600 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65  ibling page asse
34610 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20  mbled above was 
34620 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  not the right-mo
34630 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20  st sibling,.    
34640 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69  ** insert a divi
34650 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68  der cell into th
34660 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
34670 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
34680 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d  ( i<nNew-1 || j=
34690 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66  =nCell );.    if
346a0 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ( j<nCell ){.   
346b0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
346c0 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
346d0 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20       int sz;..  
346e0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
346f0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
34700 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b   pCell = apCell[
34710 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73  j];.      sz = s
34720 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43  zCell[j] + leafC
34730 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
34740 20 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53   pTemp = &aOvflS
34750 70 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d  pace[iOvflSpace]
34760 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
34770 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  w->leaf ){.     
34780 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d     memcpy(&pNew-
34790 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c  >aData[8], pCell
347a0 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 4);.      }els
347b0 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29  e if( leafData )
347c0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
347d0 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65  the tree is a le
347e0 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e  af-data tree, an
347f0 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  d the siblings a
34800 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20  re leaves, .    
34810 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
34820 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20  e is no divider 
34830 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  cell in apCell[]
34840 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64  . Instead, the d
34850 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20  ivider .        
34860 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73  ** cell consists
34870 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
34880 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68  key for the righ
34890 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a  t-most cell of .
348a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
348b0 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65  ibling-page asse
348c0 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79  mbled above only
348d0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
348e0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
348f0 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b  fo;.        j--;
34900 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61  .        btreePa
34910 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c  rseCellPtr(pNew,
34920 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66   apCell[j], &inf
34930 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  o);.        pCel
34940 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20  l = pTemp;.     
34950 20 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74 56     sz = 4 + putV
34960 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c  arint(&pCell[4],
34970 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20   info.nKey);.   
34980 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a       pTemp = 0;.
34990 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
349a0 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b       pCell -= 4;
349b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63  .        /* Obsc
349c0 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e  ure case for non
349d0 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73  -leaf-data trees
349e0 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74  : If the cell at
349f0 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20   pCell was.     
34a00 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79     ** previously
34a10 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61   stored on a lea
34a20 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20  f node, and its 
34a30 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61  reported size wa
34a40 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  s 4.        ** b
34a50 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61  ytes, then it ma
34a60 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d  y actually be sm
34a70 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20  aller than this 
34a80 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65  .        ** (see
34a90 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
34aa0 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73  tr(), 4 bytes is
34ab0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a   the minimum siz
34ac0 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
34ad0 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69  any cell). But i
34ae0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
34af0 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65  o pass the corre
34b00 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20  ct size to .    
34b10 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c      ** insertCel
34b20 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20  l(), so reparse 
34b30 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20  the cell now..  
34b40 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
34b50 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
34b60 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70  is can never hap
34b70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  pen in an SQLite
34b80 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61   data file, as a
34b90 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  ll.        ** ce
34ba0 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74  lls are at least
34bb0 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c   4 bytes. It onl
34bc0 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74  y happens in b-t
34bd0 72 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20  rees used.      
34be0 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65    ** to evaluate
34bf0 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e   "IN (SELECT ...
34c00 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63  )" and similar c
34c10 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20  lauses..        
34c20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
34c30 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20  zCell[j]==4 ){. 
34c40 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
34c50 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
34c60 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  4);.          sz
34c70 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
34c80 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a  Parent, pCell);.
34c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34ca0 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c 53 70 61  }.      iOvflSpa
34cb0 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ce += sz;.      
34cc0 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
34cd0 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a  >maxLocal+23 );.
34ce0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f        assert( iO
34cf0 76 66 6c 53 70 61 63 65 20 3c 3d 20 28 69 6e 74  vflSpace <= (int
34d00 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  )pBt->pageSize )
34d10 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43 65  ;.      insertCe
34d20 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
34d30 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
34d40 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  emp, pNew->pgno,
34d50 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
34d60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34d70 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
34d80 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73  eanup;.      ass
34d90 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
34da0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
34db0 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
34dc0 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  ;..      j++;.  
34dd0 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
34de0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
34df0 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
34e00 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
34e10 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
34e20 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
34e30 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
34e40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  )==0 ){.    u8 *
34e50 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79  zChild = &apCopy
34e60 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nOld-1]->aData[
34e70 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  8];.    memcpy(&
34e80 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61  apNew[nNew-1]->a
34e90 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c  Data[8], zChild,
34ea0 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   4);.  }..  if( 
34eb0 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e  isRoot && pParen
34ec0 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70  t->nCell==0 && p
34ed0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
34ee0 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72  t<=apNew[0]->nFr
34ef0 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ee ){.    /* The
34f00 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
34f10 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e  e b-tree now con
34f20 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20  tains no cells. 
34f30 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67  The only sibling
34f40 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20  .    ** page is 
34f50 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
34f60 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43  of the parent. C
34f70 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
34f80 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   of the.    ** c
34f90 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74  hild page into t
34fa0 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65  he parent, decre
34fb0 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c  asing the overal
34fc0 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a  l height of the.
34fd0 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74      ** b-tree st
34fe0 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20  ructure by one. 
34ff0 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62 65  This is describe
35000 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63  d as the "balanc
35010 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20  e-shallower".   
35020 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68   ** sub-algorith
35030 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65  m in some docume
35040 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a  ntation..    **.
35050 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
35060 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
35070 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
35080 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43  all to copyNodeC
35090 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a  ontent() .    **
350a0 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65   sets all pointe
350b0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f  r-map entries co
350c0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64  rresponding to d
350d0 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70 61  atabase image pa
350e0 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ges .    ** for 
350f0 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65  which the pointe
35100 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68  r is stored with
35110 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62  in the content b
35120 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20  eing copied..   
35130 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
35140 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c  econd assert bel
35150 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61 74  ow verifies that
35160 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
35170 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a  is defragmented.
35180 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20      ** (it must 
35190 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75  be, as it was ju
351a0 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64  st reconstructed
351b0 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50   using assembleP
351c0 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20  age()). This.   
351d0 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   ** is important
351e0 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   if the parent p
351f0 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
35200 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  e page 1 of the 
35210 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
35220 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61  image.  */.    a
35230 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29  ssert( nNew==1 )
35240 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  ;.    assert( ap
35250 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d  New[0]->nFree ==
35260 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32 62   .        (get2b
35270 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61  yte(&apNew[0]->a
35280 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30  Data[5])-apNew[0
35290 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70  ]->cellOffset-ap
352a0 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29  New[0]->nCell*2)
352b0 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f 70   .    );.    cop
352c0 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e  yNodeContent(apN
352d0 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20  ew[0], pParent, 
352e0 26 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50 61  &rc);.    freePa
352f0 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63  ge(apNew[0], &rc
35300 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49  );.  }else if( I
35310 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
35320 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f     /* Fix the po
35330 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
35340 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65  s for all the ce
35350 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68  lls that were sh
35360 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20  ifted around. . 
35370 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
35380 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e  several differen
35390 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74  t types of point
353a0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74  er-map entries t
353b0 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  hat need to.    
353c0 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
353d0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
353e0 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  . Some of these 
353f0 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c  have been set al
35400 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a  ready, but.    *
35410 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e  * many have not.
35420 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
35430 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20  s a summary:.   
35440 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20   **.    **   1) 
35450 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f  The entries asso
35460 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20  ciated with new 
35470 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68  sibling pages th
35480 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20  at were not.    
35490 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73  **      siblings
354a0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
354b0 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  ion was called. 
354c0 54 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61  These have alrea
354d0 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  dy.    **      b
354e0 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27  een set. We don'
354f0 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20  t need to worry 
35500 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e  about old siblin
35510 67 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20  gs that were.   
35520 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74   **      moved t
35530 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
35540 2d 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29  - the freePage()
35550 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20   code has taken 
35560 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  care.    **     
35570 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a   of those..    *
35580 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68  *.    **   2) Th
35590 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
355a0 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
355b0 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
355c0 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20  overflow.    ** 
355d0 20 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79       page in any
355e0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73   overflow chains
355f0 20 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76   used by new div
35600 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73  ider cells. Thes
35610 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68  e .    **      h
35620 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79  ave also already
35630 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65   been taken care
35640 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72   of by the inser
35650 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20  tCell() code..  
35660 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29    **.    **   3)
35670 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
35680 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65  pages are not le
35690 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63  aves, then the c
356a0 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20  hild pages of.  
356b0 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20    **      cells 
356c0 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69  stored on the si
356d0 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20  bling pages may 
356e0 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
356f0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
35700 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69  *   4) If the si
35710 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
35720 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74  not internal int
35730 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20  key nodes, then 
35740 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  any.    **      
35750 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75  overflow pages u
35760 73 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c  sed by these cel
35770 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  ls may need to b
35780 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a  e updated.    **
35790 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20        (internal 
357a0 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76  intkey nodes nev
357b0 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  er contain point
357c0 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  ers to overflow 
357d0 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20  pages)..    **. 
357e0 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68     **   5) If th
357f0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
35800 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
35810 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  then the pointer
35820 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20  -map.    **     
35830 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
35840 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67   right-child pag
35850 65 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69  es of each sibli
35860 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20  ng may need.    
35870 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70  **      to be up
35880 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  dated..    **.  
35890 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64    ** Cases 1 and
358a0 20 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74   2 are dealt wit
358b0 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72  h above by other
358c0 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a   code. The next.
358d0 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61      ** block dea
358e0 6c 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20  ls with cases 3 
358f0 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e  and 4 and the on
35900 65 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61  e after that, ca
35910 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20  se 5. Since.    
35920 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69  ** setting a poi
35930 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69  nter map entry i
35940 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65  s a relatively e
35950 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
35960 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  on, this.    ** 
35970 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70  code only sets p
35980 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
35990 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20  es for child or 
359a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
359b0 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20  hat have.    ** 
359c0 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62  actually moved b
359d0 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a  etween pages.  *
359e0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
359f0 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a  New = apNew[0];.
35a00 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
35a10 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20  d = apCopy[0];. 
35a20 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77     int nOverflow
35a30 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   = pOld->nOverfl
35a40 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78  ow;.    int iNex
35a50 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  tOld = pOld->nCe
35a60 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a  ll + nOverflow;.
35a70 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f      int iOverflo
35a80 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f  w = (nOverflow ?
35a90 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
35aa0 69 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a  idx : -1);.    j
35ab0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
35ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ad0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c    /* Current 'ol
35ae0 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  d' sibling page 
35af0 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20  */.    k = 0;   
35b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
35b20 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69  rent 'new' sibli
35b30 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66  ng page */.    f
35b40 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
35b50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
35b60 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a   isDivider = 0;.
35b70 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d        while( i==
35b80 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20  iNextOld ){.    
35b90 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73      /* Cell i is
35ba0 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69   the cell immedi
35bb0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
35bc0 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e  the last cell on
35bd0 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   old.        ** 
35be0 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20  sibling page j. 
35bf0 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
35c00 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67  are not leaf pag
35c10 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20  es of an.       
35c20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   ** intkey b-tre
35c30 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77  e, then cell i w
35c40 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  as a divider cel
35c50 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  l. */.        as
35c60 73 65 72 74 28 20 6a 2b 31 20 3c 20 41 72 72 61  sert( j+1 < Arra
35c70 79 53 69 7a 65 28 61 70 43 6f 70 79 29 20 29 3b  ySize(apCopy) );
35c80 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d 20  .        pOld = 
35c90 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20  apCopy[++j];.   
35ca0 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20       iNextOld = 
35cb0 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20  i + !leafData + 
35cc0 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f  pOld->nCell + pO
35cd0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
35ce0 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d         if( pOld-
35cf0 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
35d00 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f          nOverflo
35d10 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  w = pOld->nOverf
35d20 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69  low;.          i
35d30 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21  Overflow = i + !
35d40 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d  leafData + pOld-
35d50 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a 20  >aOvfl[0].idx;. 
35d60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35d70 20 69 73 44 69 76 69 64 65 72 20 3d 20 21 6c 65   isDivider = !le
35d80 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20 20 20  afData;  .      
35d90 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
35da0 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 69  nOverflow>0 || i
35db0 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20 20  Overflow<i );.  
35dc0 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72      assert(nOver
35dd0 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e  flow<2 || pOld->
35de0 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 4f  aOvfl[0].idx==pO
35df0 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78  ld->aOvfl[1].idx
35e00 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  -1);.      asser
35e10 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c 7c  t(nOverflow<3 ||
35e20 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e   pOld->aOvfl[1].
35e30 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c  idx==pOld->aOvfl
35e40 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20  [2].idx-1);.    
35e50 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c    if( i==iOverfl
35e60 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ow ){.        is
35e70 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20 20  Divider = 1;.   
35e80 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65       if( (--nOve
35e90 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20  rflow)>0 ){.    
35ea0 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b        iOverflow+
35eb0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
35ec0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
35ed0 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a  i==cntNew[k] ){.
35ee0 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20          /* Cell 
35ef0 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d  i is the cell im
35f00 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
35f10 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ing the last cel
35f20 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20 20  l on new.       
35f30 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65   ** sibling page
35f40 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69   k. If the sibli
35f50 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66  ngs are not leaf
35f60 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20   pages of an.   
35f70 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62       ** intkey b
35f80 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c  -tree, then cell
35f90 20 69 20 69 73 20 61 20 64 69 76 69 64 65 72 20   i is a divider 
35fa0 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cell.  */.      
35fb0 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b    pNew = apNew[+
35fc0 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +k];.        if(
35fd0 20 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f 6e   !leafData ) con
35fe0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
35ff0 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
36000 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Old );.      ass
36010 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a  ert( k<nNew );..
36020 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
36030 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61  cell was origina
36040 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c  lly divider cell
36050 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77   (and is not now
36060 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e  ) or.      ** an
36070 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
36080 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77  or if the cell w
36090 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  as located on a 
360a0 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e  different siblin
360b0 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20  g.      ** page 
360c0 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e  before the balan
360d0 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70  cing, then the p
360e0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
360f0 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  es associated.  
36100 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20      ** with any 
36110 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f  child or overflo
36120 77 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  w pages need to 
36130 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a  be updated.  */.
36140 20 20 20 20 20 20 69 66 28 20 69 73 44 69 76 69        if( isDivi
36150 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e  der || pOld->pgn
36160 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b  o!=pNew->pgno ){
36170 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65  .        if( !le
36180 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a  afCorrection ){.
36190 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
361a0 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74  Put(pBt, get4byt
361b0 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54  e(apCell[i]), PT
361c0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77  RMAP_BTREE, pNew
361d0 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
361e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
361f0 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e  if( szCell[i]>pN
36200 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
36210 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
36220 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c  PutOvflPtr(pNew,
36230 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29   apCell[i], &rc)
36240 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36250 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
36260 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69  f( !leafCorrecti
36270 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  on ){.      for(
36280 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
36290 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6b  ){.        u32 k
362a0 65 79 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ey = get4byte(&a
362b0 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38  pNew[i]->aData[8
362c0 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  ]);.        ptrm
362d0 61 70 50 75 74 28 70 42 74 2c 20 6b 65 79 2c 20  apPut(pBt, key, 
362e0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70  PTRMAP_BTREE, ap
362f0 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72  New[i]->pgno, &r
36300 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
36310 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20  }..#if 0.    /* 
36320 54 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b 50  The ptrmapCheckP
36330 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73 20  ages() contains 
36340 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
36350 6e 74 73 20 74 68 61 74 20 76 65 72 69 66 79 20  nts that verify 
36360 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  that.    ** all 
36370 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
36380 73 20 61 72 65 20 73 65 74 20 63 6f 72 72 65 63  s are set correc
36390 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65 6c  tly. This is hel
363a0 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20 20  pful while .    
363b0 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54 68  ** debugging. Th
363c0 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64 69  is is usually di
363d0 73 61 62 6c 65 64 20 62 65 63 61 75 73 65 20 61  sabled because a
363e0 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
363f0 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61 75  e may.    ** cau
36400 73 65 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  se an assert() s
36410 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c  tatement to fail
36420 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70  .  */.    ptrmap
36430 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65 77  CheckPages(apNew
36440 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74 72  , nNew);.    ptr
36450 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 26 70  mapCheckPages(&p
36460 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64  Parent, 1);.#end
36470 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  if.  }..  assert
36480 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69  ( pParent->isIni
36490 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42  t );.  TRACE(("B
364a0 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64  ALANCE: finished
364b0 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20  : old=%d new=%d 
364c0 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20  cells=%d\n",.   
364d0 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65         nOld, nNe
364e0 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f  w, nCell));..  /
364f0 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
36500 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
36510 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
36520 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
36530 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65  ScratchFree(apCe
36540 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll);.  for(i=0; 
36550 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
36560 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
36570 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66  Old[i]);.  }.  f
36580 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
36590 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
365a0 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b  ePage(apNew[i]);
365b0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
365c0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
365d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
365e0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72 6f  lled when the ro
365f0 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
36600 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
36610 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68 61  .** overfull (ha
36620 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
36630 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a  erflow pages)..*
36640 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c 64  *.** A new child
36650 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74   page is allocat
36660 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  ed and the conte
36670 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  nts of the curre
36680 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c  nt root.** page,
36690 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72 66   including overf
366a0 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65 20 63  low cells, are c
366b0 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63  opied into the c
366c0 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a  hild. The root.*
366d0 2a 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6f  * page is then o
366e0 76 65 72 77 72 69 74 74 65 6e 20 74 6f 20 6d 61  verwritten to ma
366f0 6b 65 20 69 74 20 61 6e 20 65 6d 70 74 79 20 70  ke it an empty p
36700 61 67 65 20 77 69 74 68 20 74 68 65 20 72 69 67  age with the rig
36710 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69  ht-child .** poi
36720 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  nter pointing to
36730 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a   the new page..*
36740 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
36750 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74  rning, all point
36760 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63  er-map entries c
36770 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
36780 70 61 67 65 73 20 0a 2a 2a 20 74 68 61 74 20 74  pages .** that t
36790 68 65 20 6e 65 77 20 63 68 69 6c 64 2d 70 61 67  he new child-pag
367a0 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70  e now contains p
367b0 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 65 20 75  ointers to are u
367c0 70 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65  pdated. The.** e
367d0 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  ntry correspondi
367e0 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 72 69  ng to the new ri
367f0 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  ght-child pointe
36800 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  r of the root.**
36810 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20 75 70   page is also up
36820 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dated..**.** If 
36830 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 43  successful, *ppC
36840 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 63  hild is set to c
36850 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  ontain a referen
36860 63 65 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20  ce to the child 
36870 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20 53 51 4c  .** page and SQL
36880 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
36890 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
368a0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
368b0 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61  equired.** to ca
368c0 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
368d0 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65 78 61   on *ppChild exa
368e0 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e  ctly once. If an
368f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
36900 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
36910 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
36920 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20  *ppChild is set 
36930 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  to 0..*/.static 
36940 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
36950 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  er(MemPage *pRoo
36960 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43  t, MemPage **ppC
36970 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  hild){.  int rc;
36980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36990 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
369a0 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62  n value from sub
369b0 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
369c0 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 20  MemPage *pChild 
369d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
369e0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  * Pointer to a n
369f0 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
36a00 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
36a10 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
36a20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
36a30 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c   of the new chil
36a40 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68  d page */.  BtSh
36a50 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f  ared *pBt = pRoo
36a60 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54 68  t->pBt;    /* Th
36a70 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73  e BTree */..  as
36a80 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76  sert( pRoot->nOv
36a90 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73  erflow>0 );.  as
36aa0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
36ab0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
36ac0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  tex) );..  /* Ma
36ad0 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f  ke pRoot, the ro
36ae0 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
36af0 2d 74 72 65 65 2c 20 77 72 69 74 61 62 6c 65 2e  -tree, writable.
36b00 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
36b10 0a 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20  .  ** page that 
36b20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
36b30 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20  new right-child 
36b40 6f 66 20 70 50 61 67 65 2e 20 43 6f 70 79 20 74  of pPage. Copy t
36b50 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a  he contents.  **
36b60 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 73 74 6f   of the node sto
36b70 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74  red on pRoot int
36b80 6f 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  o the new child 
36b90 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  page..  */.  rc 
36ba0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
36bb0 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
36bc0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
36bd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36be0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
36bf0 65 65 50 61 67 65 28 70 42 74 2c 26 70 43 68 69  eePage(pBt,&pChi
36c00 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52  ld,&pgnoChild,pR
36c10 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20  oot->pgno,0);.  
36c20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e    copyNodeConten
36c30 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2c  t(pRoot, pChild,
36c40 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 49   &rc);.    if( I
36c50 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
36c60 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
36c70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50  Bt, pgnoChild, P
36c80 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 52 6f  TRMAP_BTREE, pRo
36c90 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ot->pgno, &rc);.
36ca0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
36cb0 72 63 20 29 7b 0a 20 20 20 20 2a 70 70 43 68 69  rc ){.    *ppChi
36cc0 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  ld = 0;.    rele
36cd0 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  asePage(pChild);
36ce0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
36cf0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
36d00 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
36d10 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44  eable(pChild->pD
36d20 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
36d30 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
36d40 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f  Iswriteable(pRoo
36d50 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
36d60 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
36d70 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e  >nCell==pRoot->n
36d80 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45  Cell );..  TRACE
36d90 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79  (("BALANCE: copy
36da0 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64   root %d into %d
36db0 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  \n", pRoot->pgno
36dc0 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
36dd0 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  ;..  /* Copy the
36de0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
36df0 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43  from pRoot to pC
36e00 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  hild */.  memcpy
36e10 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20  (pChild->aOvfl, 
36e20 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70 52  pRoot->aOvfl, pR
36e30 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73  oot->nOverflow*s
36e40 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f 76  izeof(pRoot->aOv
36e50 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c  fl[0]));.  pChil
36e60 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70  d->nOverflow = p
36e70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  Root->nOverflow;
36e80 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
36e90 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 52 6f 6f  contents of pRoo
36ea0 74 2e 20 54 68 65 6e 20 69 6e 73 74 61 6c 6c 20  t. Then install 
36eb0 70 43 68 69 6c 64 20 61 73 20 74 68 65 20 72 69  pChild as the ri
36ec0 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20 20  ght-child. */.  
36ed0 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20  zeroPage(pRoot, 
36ee0 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d  pChild->aData[0]
36ef0 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20   & ~PTF_LEAF);. 
36f00 20 70 75 74 34 62 79 74 65 28 26 70 52 6f 6f 74   put4byte(&pRoot
36f10 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
36f20 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
36f30 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a 70 70 43  oChild);..  *ppC
36f40 68 69 6c 64 20 3d 20 70 43 68 69 6c 64 3b 0a 20  hild = pChild;. 
36f50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
36f60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
36f70 70 61 67 65 20 74 68 61 74 20 70 43 75 72 20 63  page that pCur c
36f80 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
36f90 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  to has just been
36fa0 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20   modified in.** 
36fb0 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66  some way. This f
36fc0 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20  unction figures 
36fd0 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69  out if this modi
36fe0 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74  fication means t
36ff0 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73  he.** tree needs
37000 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c   to be balanced,
37010 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73   and if so calls
37020 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
37030 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72   balancing .** r
37040 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e 63 69 6e  outine. Balancin
37050 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 3a 0a  g routines are:.
37060 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f  **.**   balance_
37070 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20 62 61 6c  quick().**   bal
37080 61 6e 63 65 5f 64 65 65 70 65 72 28 29 0a 2a 2a  ance_deeper().**
37090 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f     balance_nonro
370a0 6f 74 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ot().*/.static i
370b0 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72  nt balance(BtCur
370c0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
370d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
370e0 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4d  ;.  const int nM
370f0 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42 74 2d 3e  in = pCur->pBt->
37100 75 73 61 62 6c 65 53 69 7a 65 20 2a 20 32 20 2f  usableSize * 2 /
37110 20 33 3b 0a 20 20 75 38 20 61 42 61 6c 61 6e 63   3;.  u8 aBalanc
37120 65 51 75 69 63 6b 53 70 61 63 65 5b 31 33 5d 3b  eQuickSpace[13];
37130 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30  .  u8 *pFree = 0
37140 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69  ;..  TESTONLY( i
37150 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
37160 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 20  _called = 0 );. 
37170 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62   TESTONLY( int b
37180 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61  alance_deeper_ca
37190 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a 20 20 64  lled = 0 );..  d
371a0 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  o {.    int iPag
371b0 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
371c0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
371d0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
371e0 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20 20 20 20  ge[iPage];..    
371f0 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 7b 0a  if( iPage==0 ){.
37200 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
37210 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
37220 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f        /* The roo
37230 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
37240 74 72 65 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  tree is overfull
37250 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 63  . In this case c
37260 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 20 20 20  all the.        
37270 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ** balance_deepe
37280 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r() function to 
37290 63 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69  create a new chi
372a0 6c 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d  ld for the root-
372b0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
372c0 61 6e 64 20 63 6f 70 79 20 74 68 65 20 63 75 72  and copy the cur
372d0 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
372e0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
372f0 6f 20 69 74 2e 20 54 68 65 0a 20 20 20 20 20 20  o it. The.      
37300 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74    ** next iterat
37310 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
37320 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  op will balance 
37330 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 0a  the child page..
37340 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20          */ .    
37350 20 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c      assert( (bal
37360 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c  ance_deeper_call
37370 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ed++)==0 );.    
37380 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
37390 5f 64 65 65 70 65 72 28 70 50 61 67 65 2c 20 26  _deeper(pPage, &
373a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 29  pCur->apPage[1])
373b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
373c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
373d0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
373e0 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Page = 1;.      
373f0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
37400 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  0] = 0;.        
37410 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 31 5d    pCur->aiIdx[1]
37420 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
37430 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
37440 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c  Page[1]->nOverfl
37450 6f 77 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ow );.        }.
37460 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
37470 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
37480 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
37490 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
374a0 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e  ow==0 && pPage->
374b0 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20  nFree<=nMin ){. 
374c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
374d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d  }else{.      Mem
374e0 50 61 67 65 20 2a 20 63 6f 6e 73 74 20 70 50 61  Page * const pPa
374f0 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  rent = pCur->apP
37500 61 67 65 5b 69 50 61 67 65 2d 31 5d 3b 0a 20 20  age[iPage-1];.  
37510 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 49      int const iI
37520 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
37530 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a 20 20 20 20  [iPage-1];..    
37540 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
37550 67 65 72 57 72 69 74 65 28 70 50 61 72 65 6e 74  gerWrite(pParent
37560 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
37570 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37580 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  _OK ){.#ifndef S
37590 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
375a0 42 41 4c 41 4e 43 45 0a 20 20 20 20 20 20 20 20  BALANCE.        
375b0 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
375c0 74 61 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ta.         && p
375d0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
375e0 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =1.         && p
375f0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  Page->aOvfl[0].i
37600 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx==pPage->nCell
37610 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
37620 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20  rent->pgno!=1.  
37630 20 20 20 20 20 20 20 26 26 20 70 50 61 72 65 6e         && pParen
37640 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a 20  t->nCell==iIdx. 
37650 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
37660 20 20 20 20 2f 2a 20 43 61 6c 6c 20 62 61 6c 61      /* Call bala
37670 6e 63 65 5f 71 75 69 63 6b 28 29 20 74 6f 20 63  nce_quick() to c
37680 72 65 61 74 65 20 61 20 6e 65 77 20 73 69 62 6c  reate a new sibl
37690 69 6e 67 20 6f 66 20 70 50 61 67 65 20 6f 6e 20  ing of pPage on 
376a0 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 20 20  which.          
376b0 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ** to store the 
376c0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 62  overflow cell. b
376d0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
376e0 6e 73 65 72 74 73 20 61 20 6e 65 77 20 63 65 6c  nserts a new cel
376f0 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  l.          ** i
37700 6e 74 6f 20 70 50 61 72 65 6e 74 2c 20 77 68 69  nto pParent, whi
37710 63 68 20 6d 61 79 20 63 61 75 73 65 20 70 50 61  ch may cause pPa
37720 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 2e 20 49  rent overflow. I
37730 66 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  f this.         
37740 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65   ** happens, the
37750 20 6e 65 78 74 20 69 6e 74 65 72 61 74 69 6f 6e   next interation
37760 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
37770 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 70 50 61  will balance pPa
37780 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20 20 20  rent .          
37790 2a 2a 20 75 73 65 20 65 69 74 68 65 72 20 62 61  ** use either ba
377a0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
377b0 6f 72 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  or balance_deepe
377c0 72 28 29 2e 20 55 6e 74 69 6c 20 74 68 69 73 0a  r(). Until this.
377d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70            ** hap
377e0 70 65 6e 73 2c 20 74 68 65 20 6f 76 65 72 66 6c  pens, the overfl
377f0 6f 77 20 63 65 6c 6c 20 69 73 20 73 74 6f 72 65  ow cell is store
37800 64 20 69 6e 20 74 68 65 20 61 42 61 6c 61 6e 63  d in the aBalanc
37810 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 0a 20 20  eQuickSpace[].  
37820 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65          ** buffe
37830 72 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  r. .          **
37840 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68  .          ** Th
37850 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65  e purpose of the
37860 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
37870 74 28 29 20 69 73 20 74 6f 20 63 68 65 63 6b 20  t() is to check 
37880 74 68 61 74 20 6f 6e 6c 79 20 61 0a 20 20 20 20  that only a.    
37890 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
378a0 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f  call to balance_
378b0 71 75 69 63 6b 28 29 20 69 73 20 6d 61 64 65 20  quick() is made 
378c0 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f  for each call to
378d0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
378e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  ** function. If 
378f0 74 68 69 73 20 77 65 72 65 20 6e 6f 74 20 76 65  this were not ve
37900 72 69 66 69 65 64 2c 20 61 20 73 75 62 74 6c 65  rified, a subtle
37910 20 62 75 67 20 69 6e 76 6f 6c 76 69 6e 67 20 72   bug involving r
37920 65 75 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a  euse.          *
37930 2a 20 6f 66 20 74 68 65 20 61 42 61 6c 61 6e 63  * of the aBalanc
37940 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 20 6d 69  eQuickSpace[] mi
37950 67 68 74 20 73 6e 65 61 6b 20 69 6e 2e 0a 20 20  ght sneak in..  
37960 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
37970 20 20 20 20 20 61 73 73 65 72 74 28 20 28 62 61       assert( (ba
37980 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c  lance_quick_call
37990 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ed++)==0 );.    
379a0 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
379b0 63 65 5f 71 75 69 63 6b 28 70 50 61 72 65 6e 74  ce_quick(pParent
379c0 2c 20 70 50 61 67 65 2c 20 61 42 61 6c 61 6e 63  , pPage, aBalanc
379d0 65 51 75 69 63 6b 53 70 61 63 65 29 3b 0a 20 20  eQuickSpace);.  
379e0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
379f0 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
37a00 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69         /* In thi
37a10 73 20 63 61 73 65 2c 20 63 61 6c 6c 20 62 61 6c  s case, call bal
37a20 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74  ance_nonroot() t
37a30 6f 20 72 65 64 69 73 74 72 69 62 75 74 65 20 63  o redistribute c
37a40 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ells.          *
37a50 2a 20 62 65 74 77 65 65 6e 20 70 50 61 67 65 20  * between pPage 
37a60 61 6e 64 20 75 70 20 74 6f 20 32 20 6f 66 20 69  and up to 2 of i
37a70 74 73 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  ts sibling pages
37a80 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 0a  . This involves.
37a90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64            ** mod
37aa0 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
37ab0 6e 74 73 20 6f 66 20 70 50 61 72 65 6e 74 2c 20  nts of pParent, 
37ac0 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65 20  which may cause 
37ad0 70 50 61 72 65 6e 74 20 74 6f 0a 20 20 20 20 20  pParent to.     
37ae0 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 20 6f       ** become o
37af0 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72  verfull or under
37b00 66 75 6c 6c 2e 20 54 68 65 20 6e 65 78 74 20 69  full. The next i
37b10 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
37b20 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20  do-loop.        
37b30 20 20 2a 2a 20 77 69 6c 6c 20 62 61 6c 61 6e 63    ** will balanc
37b40 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
37b50 65 20 74 6f 20 63 6f 72 72 65 63 74 20 74 68 69  e to correct thi
37b60 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s..          ** 
37b70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
37b80 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
37b90 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c   becomes overful
37ba0 6c 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  l, the overflow 
37bb0 63 65 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a 20 20  cell or cells.  
37bc0 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 73          ** are s
37bd0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 53 70  tored in the pSp
37be0 61 63 65 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  ace buffer alloc
37bf0 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ated immediately
37c00 20 62 65 6c 6f 77 2e 20 0a 20 20 20 20 20 20 20   below. .       
37c10 20 20 20 2a 2a 20 41 20 73 75 62 73 65 71 75 65     ** A subseque
37c20 6e 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  nt iteration of 
37c30 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c  the do-loop will
37c40 20 64 65 61 6c 20 77 69 74 68 20 74 68 69 73 20   deal with this 
37c50 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  by.          ** 
37c60 63 61 6c 6c 69 6e 67 20 62 61 6c 61 6e 63 65 5f  calling balance_
37c70 6e 6f 6e 72 6f 6f 74 28 29 20 28 62 61 6c 61 6e  nonroot() (balan
37c80 63 65 5f 64 65 65 70 65 72 28 29 20 6d 61 79 20  ce_deeper() may 
37c90 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 2c  be called first,
37ca0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
37cb0 74 20 69 74 20 64 6f 65 73 6e 27 74 20 64 65 61  t it doesn't dea
37cc0 6c 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20  l with overflow 
37cd0 63 65 6c 6c 73 20 2d 20 6a 75 73 74 20 6d 6f 76  cells - just mov
37ce0 65 73 20 74 68 65 6d 20 74 6f 20 61 0a 20 20 20  es them to a.   
37cf0 20 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72         ** differ
37d00 65 6e 74 20 70 61 67 65 29 2e 20 4f 6e 63 65 20  ent page). Once 
37d10 74 68 69 73 20 73 75 62 73 65 71 75 65 6e 74 20  this subsequent 
37d20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f  call to balance_
37d30 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20 20 20 20 20  nonroot() .     
37d40 20 20 20 20 20 2a 2a 20 68 61 73 20 63 6f 6d 70       ** has comp
37d50 6c 65 74 65 64 2c 20 69 74 20 69 73 20 73 61 66  leted, it is saf
37d60 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  e to release the
37d70 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 75   pSpace buffer u
37d80 73 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 20  sed by.         
37d90 20 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73   ** the previous
37da0 20 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 6f 76   call, as the ov
37db0 65 72 66 6c 6f 77 20 63 65 6c 6c 20 64 61 74 61  erflow cell data
37dc0 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
37dd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
37de0 70 69 65 64 20 65 69 74 68 65 72 20 69 6e 74 6f  pied either into
37df0 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 64   the body of a d
37e00 61 74 61 62 61 73 65 20 70 61 67 65 20 6f 72 20  atabase page or 
37e10 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
37e20 20 20 20 20 20 20 20 2a 2a 20 70 53 70 61 63 65         ** pSpace
37e30 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 74   buffer passed t
37e40 6f 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 6c  o the latter cal
37e50 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  l to balance_non
37e60 72 6f 6f 74 28 29 2e 0a 20 20 20 20 20 20 20 20  root()..        
37e70 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
37e80 38 20 2a 70 53 70 61 63 65 20 3d 20 73 71 6c 69  8 *pSpace = sqli
37e90 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 43  te3PageMalloc(pC
37ea0 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ur->pBt->pageSiz
37eb0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  e);.          rc
37ec0 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f   = balance_nonro
37ed0 6f 74 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78  ot(pParent, iIdx
37ee0 2c 20 70 53 70 61 63 65 2c 20 69 50 61 67 65 3d  , pSpace, iPage=
37ef0 3d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  =1);.          i
37f00 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
37f10 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46          /* If pF
37f20 72 65 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ree is not NULL,
37f30 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
37f40 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
37f50 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 20 20  used .          
37f60 20 20 2a 2a 20 62 79 20 61 20 70 72 65 76 69 6f    ** by a previo
37f70 75 73 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  us call to balan
37f80 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 20 49 74  ce_nonroot(). It
37f90 73 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 0a 20  s contents are. 
37fa0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f             ** no
37fb0 77 20 73 74 6f 72 65 64 20 65 69 74 68 65 72 20  w stored either 
37fc0 6f 6e 20 72 65 61 6c 20 64 61 74 61 62 61 73 65  on real database
37fd0 20 70 61 67 65 73 20 6f 72 20 77 69 74 68 69 6e   pages or within
37fe0 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
37ff0 20 20 2a 2a 20 6e 65 77 20 70 53 70 61 63 65 20    ** new pSpace 
38000 62 75 66 66 65 72 2c 20 73 6f 20 69 74 20 6d 61  buffer, so it ma
38010 79 20 62 65 20 73 61 66 65 6c 79 20 66 72 65 65  y be safely free
38020 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20  d here. */.     
38030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
38040 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20  geFree(pFree);. 
38050 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
38060 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 70        /* The pSp
38070 61 63 65 20 62 75 66 66 65 72 20 77 69 6c 6c 20  ace buffer will 
38080 62 65 20 66 72 65 65 64 20 61 66 74 65 72 20 74  be freed after t
38090 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a  he next call to.
380a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c            ** bal
380b0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2c 20  ance_nonroot(), 
380c0 6f 72 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74  or just before t
380d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
380e0 75 72 6e 73 2c 20 77 68 69 63 68 65 76 65 72 0a  urns, whichever.
380f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d            ** com
38100 65 73 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20  es first. */.   
38110 20 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 70         pFree = p
38120 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 7d  Space;.        }
38130 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
38140 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
38150 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   = 0;..      /* 
38160 54 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  The next iterati
38170 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f  on of the do-loo
38180 70 20 62 61 6c 61 6e 63 65 73 20 74 68 65 20 70  p balances the p
38190 61 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20  arent page. */. 
381a0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
381b0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  (pPage);.      p
381c0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
381d0 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63    }.  }while( rc
381e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
381f0 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
38200 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
38210 65 65 28 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20  ee(pFree);.  }. 
38220 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
38230 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
38240 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
38250 68 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b  he BTree.  The k
38260 65 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28  ey is given by (
38270 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e  pKey,nKey).** an
38280 64 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69  d the data is gi
38290 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44  ven by (pData,nD
382a0 61 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f  ata).  The curso
382b0 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74  r is used only t
382c0 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74  o.** define what
382d0 20 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72   table the recor
382e0 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  d should be inse
382f0 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20  rted into.  The 
38300 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66  cursor.** is lef
38310 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
38320 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e  random location.
38330 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e  .**.** For an IN
38340 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79  TKEY table, only
38350 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20   the nKey value 
38360 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73  of the key is us
38370 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20  ed.  pKey is.** 
38380 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20  ignored.  For a 
38390 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20  ZERODATA table, 
383a0 74 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44  the pData and nD
383b0 61 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e  ata are both ign
383c0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
383d0 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61  he seekResult pa
383e0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
383f0 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 75 63 63  ero, then a succ
38400 65 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a  essful call to.*
38410 2a 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  * MovetoUnpacked
38420 28 29 20 74 6f 20 73 65 65 6b 20 63 75 72 73 6f  () to seek curso
38430 72 20 70 43 75 72 20 74 6f 20 28 70 4b 65 79 2c  r pCur to (pKey,
38440 20 6e 4b 65 79 29 20 68 61 73 20 61 6c 72 65 61   nKey) has alrea
38450 64 79 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f  dy.** been perfo
38460 72 6d 65 64 2e 20 73 65 65 6b 52 65 73 75 6c 74  rmed. seekResult
38470 20 69